为什么perl不能显示所有类型的UTF8字符
我正在绞尽脑汁编写一个perl脚本,它应该能够处理IPA字符(国际拼音字母)。 对于我的perl文件和std in/out,我使用UTF8编码,如下所示:为什么perl不能显示所有类型的UTF8字符,perl,encoding,utf-8,ipa,Perl,Encoding,Utf 8,Ipa,我正在绞尽脑汁编写一个perl脚本,它应该能够处理IPA字符(国际拼音字母)。 对于我的perl文件和std in/out,我使用UTF8编码,如下所示: #!/usr/local/bin/perl use utf8; binmode(STDOUT, ":utf8"); #treat as if it is UTF-8 binmode(STDIN, ":encoding(utf8)"); #actually check if it is UTF-8 但是,当我运行这个小测试
#!/usr/local/bin/perl
use utf8;
binmode(STDOUT, ":utf8"); #treat as if it is UTF-8
binmode(STDIN, ":encoding(utf8)"); #actually check if it is UTF-8
但是,当我运行这个小测试时:
my %IPAchar = (
"69" => "i", "65" => "e", "25b" => "ɛ", "" => "ɛ̃",
"" => "œ̃", "153" => "œ", "259" => "ə", "f8" => "ø",
"79" => "y", "75" => "u", "6f" => "o", "254" => "ɔ",
"" => "ɔ̃", "e3" => "ɑ̃", "251" => "ɑ", "61" => "a",
"6a" => "j", "265" => "ɥ", "77" => "w", "6e" => "n",
"272" => "ɲ", "14b" => "ŋ", "261" => "ɡ", "6b" => "k",
"6d" => "m", "62" => "b", "70" => "p", "76" => "v",
"66" => "f", "64" => "d", "74" => "t", "292" => "ʒ",
"283" => "ʃ", "7a" => "z", "73" => "s", "281" => "ʁ",
"6c" => "l", "" => "h", "294" => "ʔ", "2e" => ".",
"280" => "ʀ", "1dd" => "ǝ", "72" => "r", "3b5" => "ε",
"67" => "g", "25c" => "ɜ", "2d0" => "ː", "2c8" => "ˈ",
"2b0" => "ʰ", "26a" => "ɪ"
);
foreach my $k ( sort keys(%IPAchar) ) {
print "\n[$k] /$IPAchar{$k}/";
}
没有正确打印所有字符。这很奇怪,因为字符“ä”或“ø”或“ε”显示正确,但我无法使其他特定字符正常工作,例如“ʃ”、“ɜ”
如果有人能帮助我,我真的会非常感激
谢谢你的阅读
Simon您是在控制台上还是在编辑器中查看程序的输出 即使您的程序正在为您想要的符号生成正确的字符代码,您也必须使用支持这些符号的字体来显示文本;否则显示就没有意义了 使用浏览器打开文本文件可能很有用,因为web浏览器必须适应几乎任何官方编码,并且通常能够正确呈现文件内容 快速搜索找到支持IP符号的字体。如果您使用其中一个,那么您应该能够正确地看到您的输出 我强烈推荐,在我所知道的任何字体中,它对Unicode字符集的覆盖率最好。这是一种无衬线字体
更新
让我担心的是,您对
%IPAchar
散列的定义中有多个键被设置为空字符串“
”。它是一个完全有效的散列键,但散列的性质意味着只能有一个元素将其作为键。在这种情况下,哈希元素$IPAchar{'}
的值是未定义的。实际上,它将被设置为列表中具有相同键的最后一个值,因此在您的情况下,$IPAchar{'}='h'
我只是确认它工作正常。以下是在Cygwin上设置GNU Unicode的方法:
如果尚未安装,请安装Cygwin附带的X11。有关详细信息,请参阅Cygwin/X用户指南。选择其他X11实用程序时,请确保从类别X11添加mkfontdir和xset
决定放置GNU unifont的目录。我为以下内容选择了~/X11/font
cp unifont.pcf.gz ~/X11/font/unifont.pcf.gz
mkfontdir ~/X11/font
如果尚未运行,请启动X服务器,例如使用startxwin
export DISPLAY=:0
xset +fp ~/X11/font
xterm -fn '-gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1'
+1用于拼写“怪异”,无错误倾向:
my%IPAchar=map{$\=>chr(hex($\))}qw(69 65 25b代码>我不认为它是未定义的。它可能有文档记录,也可能没有文档记录,但许多代码(例如,%h=(%h,@extras);
)依赖于当前的行为。。还有太多的汉字了@池上:我明白你的意思,改变这种行为的将是一个勇敢的灵魂,但“未记录”是没有定义的。我想不出更好的定义了,除了一些被记录为“未定义”的东西,这是我们允许自己的一种奇怪的放纵。未定义的行为意味着它可以做任何事情,包括抛出错误。未记录意味着它不在文档中。它们的意思不一样。至于汉字,它们根本不适合计算机字符集,但我不会让它们有任何其他方式!