作者liyih ()
看板Perl
标题Re: [问题] 全型空格置换
时间Wed Oct 28 18:21:16 2009
※ 引述《xsinx (鲜菇)》之铭言:
: 文件内容大概是长这样的:
: 我(I) 有(Have) 一只(A) 狗(Dog) .
: 想要将文件里的所有全型空格置换成半型空格
: 再做其他的处理
: 我的写法是先读进这个档案并存至@line
: 如下
: foreach $line (@line)
: {
: $line =~ s/ / /g;
: ...
: ...
: }
: 可执行後却好像完全忽略掉这一行
: 都没有变化
: 後来我又改成
: $line =~ s/( )?/ /g;
: 结果文件的中文部分都变成了一堆问号的集合
: 英文全部变成全型
: 请问这是什麽问题呢?
: perl会无法判别全型的SPACE吗
: 还是语系的问题呢?
: 可是没有这一行的话,其他部分都能够全然处理成功说
: 希望能有解答
: 谢谢大家~
建议您可以先使用 Data::Dump 模组来确定各内容是使用 DBCS 或是
MBCS 的编码。另外尚需考虑三个部份的编码:
1. 外部档案的原始编码,如 line.txt。
2. Perl 内部字串的编码,变数内部的编码方式。
3. 程式原始档案的编码,如 line.pl。
关於 DBCS 与 MBCS 可以参考:
http://en.wikipedia.org/wiki/DBCS
http://en.wikipedia.org/wiki/Variable-width_encoding
执行结果如下:
(
"Data::Dump",
pack("H*","e68891284929e38080e69c89284861766529e38080e4b880e99abb284129e38080
^^^^^^ ^^^^^^ ^^^^^^
OCe78b9728446f6729e380802e0a"),
^^^^^^
)
("Data::Dump", "\xE3\x80\x80")
(
"Data::Dump",
"\x{6211}(I)\x{3000}\x{6709}(Have)\x{3000}\x{4E00}\x{96BB}(A)\x{3000}
^^^^^^^^ ^^^^^^^^ ^^^^^^^^
\x{72D7}(Dog)\x{3000}.\n",
^^^^^^^^
)
("Data::Dump", "\x{3000}")
我(I) 有(Have) 一只(A) 狗(Dog) .
==== line.pl =================================================================
#!/usr/bin/perl -w
use strict;
use warnings;
use Data::Dump;
open(FH, "line.txt");
my $line = <FH>;
close(FH);
my $space = " ";
print Data::Dump->dump($line), "\n";
print Data::Dump->dump($space), "\n";
print Data::Dump->dump(decode('utf-8', $line)), "\n";
print Data::Dump->dump(decode('utf-8', $space)), "\n";
$line =~ s/$space/ /g;
print $line;
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.114.64.130
1F:推 herculus6502:专业推!! 10/28 20:26
2F:推 abliou:推!! 10/29 10:06