perlcn - ç®€ä½“ä¸æ–‡ Perl 指å�—
从 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>
|
úÁËÌÁÄËÉ ÎÁ ÓÁÊÔÅ ðÒÏÓÌÅÄÉÔØ ÚÁ ÓÔÒÁÎÉÃÅÊ |
Created 1996-2026 by Maxim Chirkov äÏÂÁ×ÉÔØ ÎÏ×ÏÓÔØ, ðÏÄÄÅÒÖÁÔØ |