1.1.1 提出问题
你想在代码里面通过Unicode字符的名字来使用一些奇怪的字符,而无需为那些奇怪字符的Unicode编码是多少而烦恼。
1.1.2 解决方案
先在程序开头写上use charnames,然后在程序的字符串里面就可以自由地插入"\N{CHARSPEC}" 这样的转义来使用那些字符。
1.1.3 讨论
use charnames 这行宏编译指令使你可以使用Unicode字符的名字(symbolic names)。你访问的这些双引号引起来的\N{CHARSPEC}其实是编译时常量。它支持几个子宏编译指令: :full子宏编译指令让你可以而且必须使用完整的字符名字来访问Unicode字符,完整的字符名字得跟Unicode字符数据库里面的名字(包括大小写)完全一样才行。:short子宏编译指令带来方便的缩写。没有冒号的子宏编译指令会被当成一组数据的名字,给访问这组数据带来快捷(注意访问时大小写敏感):
use charnames ':full'; print "\N{GREEK CAPITAL LETTER DELTA} is called delta.\n";
# $>D is called delta.
use charnames ':short'; print "\N{greek:Delta} is an upper-case delta.\n";
# $>D is an upper-case delta.
use charnames qw(cyrillic greek); print "\N{Sigma} and \N{sigma} are Greek sigmas.\n"; print "\N{Be} and \N{be} are Cyrillic bes.\n";
# $>S and s are Greek sigmas. # $> and are Cyrillic bes.
#有些输出这里贴不出来了,自己运行一下看看吧 :)
|
charnames::viacode 跟 charnames::vianame这2个函数可以转换Unicode的数字编码(code point)跟它对应的长名。Unicode的文档使用了U+XXXX这样的符号来表示code point=XXXX的Unicode字符。所以我们下面这个例子也是以这样的方式输出:
use charnames qw(:full); for $code (0xC4, 0x394) { printf "Character U+%04X (%s) is named %s\n", $code, chr($code), charnames::viacode($code); }
# $>Character U+00C4 (Ä) is named LATIN CAPITAL LETTER A WITH DIAERESIS
# $>Character U+0394 (D) is named GREEK CAPITAL LETTER DELTA
use charnames qw(:full); $name = "MUSIC SHARP SIGN"; $code = charnames::vianame($name); printf "%s is character U+%04X (%s)\n", $name, $code, chr($code);
# $>MUSIC SHARP SIGN is character U+266F (#)
|
下面是怎样找到Unicode字符数据库在Perl里面的一个副本:
% perl -MConfig -le 'print "$Config{privlib}/unicore/NamesList.txt"'
# $>/usr/local/lib/perl5/5.8.1/unicore/NamesList.txt
从这个文件你可以得到对你有用的Unicode字符名字。
1.2.4 参考
请参考charnames(3)和大骆驼书的31章;关于unicode数据库可以参考
阅读(702) | 评论(0) | 转发(0) |