1.5 使用命名Unicode字符
时间:2006-12-27 来源:xiaoshengcaicai
1.5 使用命名Unicode字符
1.5.1 问题
你想在代码里面通过Unicode字符的名字来使用一些奇怪的字符,而无需为那些奇怪字符的Unicode编码是多少而烦恼。
1.5.2 解决方案
先在程序开头写上use charnames,然后在程序的字符串里面就可以自由地插入"\N{CHARSPEC}" 这样的转义来使用那些字符。
1.5.3 讨论
use charnames 这行宏编译指令使你可以使用Unicode字符的名字(symbolic names)。你访问的这些双引号引起来的\N{CHARSPEC}其实是编译时常量。它支持几个子宏编译指令: :full子宏编译指令让你可以而且必须使用完整的字符名字来访问Unicode字符,完整的字符名字得跟Unicode字符数据库里面的名字(包括大小写)完全一样才行。:short子宏编译指令带来方便的缩写。没有冒号的子宏编译指令会被当成一组数据的名字,给访问这组数据带来快捷(注意访问时大小写敏感)。(Any import without a colon tag is taken to be a script name, giving case-sensitive shortcuts for those scripts.)
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.
500)this.width=500;" border="0">and 500)this.width=500;" border="0">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.5.4 参阅
The charnames(3) manpage 和 Programming Per 第31章; the Unicode Character Database at http://www.unicode.org/