从 5.8.0 版开始, Perl 具备了完善的 Unicode (统一ç ) 支æ´, 也连带支æ´äº†è®¸å¤šæ‹‰ä¸è¯ç³»ä»¥å¤–çš„ç¼–ç æ–¹å¼; CJK (䏿—¥éŸ©) 便是其ä¸çš„一部份. Unicode æ˜¯å›½é™…æ€§çš„æ ‡å‡†, 试图涵盖世界上所有的å—符: 西方世界, 东方世界, 以åŠä¸¤è€…间的一切 (希腊文, å™åˆ©äºšæ–‡, 亚拉伯文, å¸Œä¼¯æ¥æ–‡, å°åº¦æ–‡, å°åœ°å®‰æ–‡, ç‰ç‰). 它也容纳了多ç§ä½œä¸šç³»ç»Ÿä¸Žå¹³å° (如 PC åŠéº¦é‡‘å¡”).
Perl 本身以 Unicode 进行æ“作. 这表示 Perl 内部的å—符串数æ®å¯ç”¨ Unicode 表示; Perl 的函å¼ä¸Žç®—符 (例如æ£è§„è¡¨ç¤ºå¼æ¯”对) 也能对 Unicode 进行æ“作. 在输入åŠè¾“出时, 为了处ç†ä»¥ Unicode 之å‰çš„ç¼–ç æ–¹å¼å˜æ”¾çš„æ•°æ®, Perl æä¾›äº† Encode 这个模å—, å¯ä»¥è®©ä½ 轻易地读å–åŠå†™å…¥æ—§æœ‰çš„ç¼–ç æ•°æ®.
Encode å»¶ä¼¸æ¨¡å—æ”¯æ´ä¸‹åˆ—ç®€ä½“ä¸æ–‡çš„ç¼–ç æ–¹å¼ ('gb2312' 表示 'euc-cn'):
euc-cn Unix 延伸å—符集, ä¹Ÿå°±æ˜¯ä¿—ç§°çš„å›½æ ‡ç
gb2312-raw 未ç»å¤„ç†çš„ (低比特) GB2312 å—符表
gb12345 未ç»å¤„ç†çš„ä¸å›½ç”¨ç¹ä½“䏿–‡ç¼–ç
iso-ir-165 GB2312 + GB6345 + GB8565 + 新增å—符
cp936 å—ç 页 936, 也å¯ä»¥ç”¨ 'GBK' (æ‰©å……å›½æ ‡ç ) 指明
hz 7 æ¯”ç‰¹é€¸å‡ºå¼ GB2312 ç¼–ç
举例æ¥è¯´, å°† EUC-CN ç¼–ç çš„æ¡£æ¡ˆè½¬æˆ Unicode, 祗需键入下列指令:
perl -Mencoding=euc-cn,STDOUT,utf8 -pe1 < file.euc-cn > file.utf8
Perl 也内附了 ``piconv'', 一支完全以 Perl 写æˆçš„å—符转æ¢å·¥å…·ç¨‹åº, 用法如下:
piconv -f euc-cn -t utf8 < file.euc-cn > file.utf8
piconv -f utf8 -t euc-cn < file.utf8 > file.euc-cn
å¦å¤–, 利用 encoding 模å—, ä½ å¯ä»¥è½»æ˜“写出以å—符为å•ä½çš„程åºç , 如下所示:
#!/usr/bin/env perl
# å¯åЍ euc-cn å—串解æž; æ ‡å‡†è¾“å‡ºå…¥åŠæ ‡å‡†é”™è¯¯éƒ½è®¾ä¸º euc-cn ç¼–ç
use encoding 'euc-cn', STDIN => 'euc-cn', STDOUT => 'euc-cn';
print length("骆驼"); # 2 (åŒå¼•å·è¡¨ç¤ºå—符)
print length('骆驼'); # 4 (å•引å·è¡¨ç¤ºå—节)
print index("谆谆教诲", "蛔唤"); # -1 (ä¸åŒ…嫿¤åå—符串)
print index('谆谆教诲', '蛔唤'); # 1 (从第二个å—节开始)
在最åŽä¸€åˆ—例å里, ``è°†'' 的第二个å—节与 ``è°†'' 的第一个å—èŠ‚ç»“åˆæˆ EUC-CN ç çš„ ``è›”''; ``è°†'' 的第二个å—节则与 ``æ•™'' 的第一个å—èŠ‚ç»“åˆæˆ ``唤''. è¿™è§£å†³äº†ä»¥å‰ EUC-CN ç æ¯”对处ç†ä¸Šå¸¸è§çš„问题.
gb18030 æ‰©å……è¿‡çš„å›½æ ‡ç , 包å«ç¹ä½“䏿–‡
å¦å¤–, Encode::HanConvert 模å—则æä¾›äº†ç®€ç¹è½¬æ¢ç”¨çš„两ç§ç¼–ç :
big5-simp Big5 ç¹ä½“䏿–‡ä¸Ž Unicode ç®€ä½“ä¸æ–‡äº’转
gbk-trad GBK ç®€ä½“ä¸æ–‡ä¸Ž Unicode ç¹ä½“䏿–‡äº’转
若想在 GBK 与 Big5 之间互转, 请å‚考该模å—内附的 b2g.pl 与 g2b.pl 两支程åº, 或在程åºå†…使用下列写法:
use Encode::HanConvert;
$euc_cn = big5_to_gb($big5); # 从 Big5 转为 GBK
$big5 = gb_to_big5($euc_cn); # 从 GBK 转为 Big5
Autrijus Tang (å”宗汉) <autrijus@autrijus.org>