令我惊恐的是,我刚刚发现它chr
不适用于 Unicode,尽管它可以做一些事情。手册页很清楚
返回字符集中由该 NUMBER 表示的字符。例如,chr(65)" 是 ASCII 或 Unicode 中的 "A",而 chr(0x263a) 是 Unicode 笑脸。
事实上,我可以使用打印笑脸
perl -e 'print chr(0x263a)'
但是诸如此类的chr(0x00C0)
事情不起作用。我看我的perl v5.10.1有点老了,但是当我在源代码中粘贴各种奇怪的字母时,一切都很好。
我尝试过类似 and 之类的有趣的东西use utf8
,use encoding 'utf8'
但我没有尝试过类似 and 之类的有趣的东西use v5.12
,use feature 'unicode_strings'
因为它们不适用于我的版本,所以我在胡闹Encode::decode
发现我不需要解码,因为我没有要解码的字节数组。我阅读的文档比以往任何时候都多,发现了很多有趣的东西,但没有任何帮助。它看起来像是一种Unicode Bug,但没有给出可用的解决方案。此外,我不关心整个字符串语义,我只需要一个微不足道的函数。
那么如何将数字转换为由与其对应的单个字符组成的字符串,例如real_chr(0xC0) eq 'À'
成立呢?
我得到的第一个答案解释了有关 IO 的所有内容,但我仍然不明白为什么
#!/usr/bin/perl -w
use strict;
use utf8;
use encoding 'utf8';
print chr(0x00C0) eq 'À' ? 'eq1' : 'ne1', " - ", chr(0x263a) eq '☺' ? 'eq1' : 'ne1', "\n";
print 'À' =~ /\w/ ? "match1" : "no_match1", " - ", chr(0x00C0) =~ /\w/ ? "match2" : "no_match2", "\n";
印刷
ne1 - eq1
match1 - no_match2
这意味着手动输入的'À'
不同于chr(0x00C0)
。此外,前者是单词组成字符(正确!),而后者不是(但应该是!)。