chr
在Unicode上不起作用,尽管它确实做了一些事情。这个人页却一点都不清楚。
事实上,我可以使用以下方法打印一个笑脸:返回在字符集中由该数字表示的字符。例如,chr(65)代表ASCII或Unicode中的"A",而chr(0x263a)则是一个Unicode笑脸。
perl -e 'print chr(0x263a)'
但是像 chr(0x00C0)
这样的东西不起作用。我发现我的 perl v5.10.1 有点古老,但当我在源代码中粘贴各种奇怪的字母时,一切都正常。
我尝试了一些有趣的事情,比如 use utf8
和 use encoding 'utf8'
,但我没有尝试 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)
不同。此外,前者是一个单词组成字符(正确!),而后者不是(但应该是!)。
C3 81
,C1
是 ISO-8859-1 代码点。我的 Perl 程序能力有些薄弱,否则我会提出一个答案。 - D.Shawleychr
不是问题,问题在于你没有为 UTF-8 进行编码和解码。如果你要输出 UTF-8(或任何其他编码),你的字符字符串需要先转换为八位字节。 - zostayeq1 - eq1; match1 - no_match2
。因此,我有两个相等的字符串,只有其中一个匹配。 - maaartinususe encoding
并附加/u
修饰符的情况下进行修复。请参阅perlre中的字符集修饰符。 - zostay