星期五, 1月 28, 2005

[perl] 關於部分字元會產生亂碼的問題??

※ 引述《snowfly.bbs@zoo.ee.ntu.edu.tw (飄然似雪)》之銘言:
> 哇哇...終於有高手做成模組了...

不敢當.

> 之前小弟有看過簡繁轉換的程式
> 但是那個程式似乎寫ㄉ不是很好
> 她是先把字設成變數然後再去變數轉陣列....

對, 那是 Lingua::ZH::HanConvert. 就是因為太慢纔想要自己寫的.

http://autrijus.org/Encode-HanConvert-0.02.tar.gz 是新版. 我可能
會收集大家用的意見之後, 加上測試檔做成 0.03.

> 解說一下該如何使用您所寫出來的模組呢?

裝完之後, perldoc Encode::HanConvert 就是了. 要 5.7.2+, 最好是
等這兩天會出來的 5.7.3; 5.7.2 的 big5 表是我還沒校過的版本, 在
點符號上有問題.

又, 模組附有 b2g.pl 和 g2b.pl 兩個可執行檔, 可以直接用, 也可以
參考 perldoc b2g.pl 看用法.

稍微抄一下:

use Encode::HanConvert; # needs perl 5.7.2 or better

# 簡繁互轉
$euc_cn = big5_to_gb($big5); # Big5 to GB2312 (EUC-CN encoding)
$big5 = gb_to_big5($euc_cn); # GB2312 to Big5

# 就地轉換 (適用於所有函式)
big5_to_gb($string); # transform $string from big5 to gb
gb_to_big5($string); # ditto.

# Unicode 簡繁互轉
$simp = trad_to_simp($trad); # Traditional to Simplified
$trad = simp_to_trad($trad); # Simplified to Traditional

# 繁/簡區域碼轉簡/繁 Unicode
$simp = big5_to_simp($big5); # Big5 to Simplified
$big5 = simp_to_big5($simp); # Simplified to Big5
$trad = gb_to_trad($euc_cn); # GB2312 to Traditional
$euc_cn = trad_to_gb($trad); # Traditional to GB2312

# 不做轉換, 祗是變 Unicode
$simp = gb_to_simp($euc_cn); # GB2312 to Simplified
$euc_cn = simp_to_gb($simp); # Simplified to GB2312
$trad = big5_to_trad($big5); # Big5 to Traditional
$big5 = trad_to_big5($trad); # Traditional to Big5

# 如果本來就在用 Lingua::ZH::HanConvert, 就可以直接代換:
use Encode::HanConvert qw(trad simple); # not exported by default
$simp = simple($trad); # Traditional to Simplified
$trad = trad($trad); # Simplified to Traditional

# 用 I/O discipline 自動轉換
require Encode::CN;
open BIG5, ':encoding(big5-simp)', 'big5.txt'; # Big5 => Simp
open EUC, '>:encoding(euc-cn)', 'euc-cn.txt'; # Simp => GB2312
print EUC, ;

require Encode::TW;
open EUC, ':encoding(euc-cn-trad)', 'euc-cn.txt'; # GB2312 => Trad
open BIG5, '>:encoding(big5)', 'big5.txt'; # Trad => Big5
print BIG5, ;

# 程式內的 Big5 雙引號內字串一律當做簡體 Unicode
use encoding 'big5-simp';
print "繁體"; # prints simplified chinese in unicode
binmode(STDIN, ':encoding(euc-cn)'); # 用 GB2312 輸出
print "繁體"; # prints simplified chinese in GB2312/EUC-CN

要注意的是, 在 Perl 裡, 我們平常說的 GB2312 要寫成 euc-cn, 不是
gb2312. 或是寫 'gbk' 也可以.