Chinaunix首页 | 论坛 | 博客
  • 博客访问: 485014
  • 博文数量: 142
  • 博客积分: 4126
  • 博客等级: 上校
  • 技术积分: 1545
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-22 10:03
文章分类

全部博文(142)

文章存档

2011年(8)

2010年(7)

2009年(64)

2008年(63)

我的朋友

分类:

2008-12-11 15:28:21

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) |
给主人留下些什么吧!~~