作者StarTouching (抚星)
看板Perl
标题Re: [问题] does not map to big5-eten
时间Tue Mar 22 19:20:51 2011
很感谢liyih大分享这两个函式,
我想有这两个函示, 应该就能处理绝大部分的状况
我把您的code拿来用, 但修改了几个小地方:
1. 多加上 use Encode; 这样 encode, decode方能运作
2. 在convert_to_utf8中, 多加入$data是否原本就有\n的判断
如果没有 就不必在最後多补上\n
3. $is_safe = $is_safe // 1; #使用defined-or
4. 不过from_to函式仍被说是undefined, 不知道该use哪个模组?
另外我把perl可能会遇到编码的部分重新思考了一下
1. 输出部分(print), 目前看来似乎一定要硬转big5, 才不会有字元map不了的状况。
也就是说 如果Perl输出utf-8到Dos, 到最後还是会被转成 big5
这部份似乎是无解, 所以还是只好自己先在程式里转。
至於写入档案、在unicode下的Unix等环境情形如何尚待测试
2. 使用者透过STDIN输入的资料, 处理过程尚未确认。
3. 外部资料, 例如我用LWP::Simple::get抓取的网页档,
或是glob "*.txt" 所抓取的档名资料串,
则可能出现编码混杂或不明确的状况
可用l大的函式硬转utf-8
4. 程式内部字串, 或是要进一步分析外部资料时,
似乎得是big5才有办法处理。
我原本都是加上 use encoding 'big5', Filter=>1;
但有了l大两个函式後, 不知道还需不需要这条。
至於Perl到底能不能直接处理unicode?
像Windows底下写C++, 就支援 L"中文" 这样的unicode字串常数。
如果把整只程式存成unicode而不是ANSI的话,
Perl会无法编译。
所以我的结论是, 如果Perl真的不能处理Unicode,
那麽外部资料都应该转big5处理(反正最後输出也是要big5),
而字串常数因为档案本来就是ANSI存档, 所以不用特地再转。
只是要记得 既然要处理big5, 就要加上 use encoding 'big5'
以上是我的一些想法, 也包含了ㄧ些问题。
毕竟 如果能处理所有unicode文字, 这样才比较方便。
下面是我运用成功的例子:
my @files = glob "相片000??.jpg";
#中文常数 不必额外处理
$_ = utf8_to_big5(convert_to_utf8($_)) foreach (@files);
#先硬转utf8再转到big5
print join "\n", @files;
比较奇怪的地方是明明档名理当都是unicode, 却还是要全转utf8一次
(猜测可能先被decode过了)
接下来我还会做更多测试, 也希望能把脉络搞得更清楚。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.243.163.36
※ 编辑: StarTouching 来自: 111.243.163.36 (03/23 01:34)