Val*_*olm 1 linux unicode perl
我得到了这段代码来处理阿拉伯语文本,它演示了我的问题:
\n\nmy $noon = "\xd9\x86";\nmy $code_point = charinfo(ord($noon))->{'code'};\nprint "Unicode code point for '\xd9\x86' (noon): U+$code_point\\n";\n\n$noon = "\\N{U+0646}";\n$code_point = sprintf("%04X", ord($noon));\nprint "Unicode code point for '\xd9\x86' (noon): U+$code_point\\n";\n$noon_code = 0x0646;\nprint (chr($noon_code), "\\n");\nRun Code Online (Sandbox Code Playgroud)\n它打印出:
\nUnicode code point for '\xd9\x86' (noon): U+00D9\nUnicode code point for '\xd9\x86' (noon): U+0646\nWide character in print at code.pl line 11.\n\xd9\x86\nRun Code Online (Sandbox Code Playgroud)\n价值观不同。我使用 Linux Mint 文本编辑器(Xed)。\n编码时似乎无法使用硬编码的阿拉伯语,但我使用了文本文件,它们包含具有正确值的字母。
\n您说您提供了以下信息:
\nmy $noon = "\xd9\x86";\nRun Code Online (Sandbox Code Playgroud)\n但您实际上提供了两个字符 0xD9 和 0x86,相当于以下内容:
\nmy $noon = "\\xD9\\x86";\nRun Code Online (Sandbox Code Playgroud)\n这是因为您告诉 Perl 脚本是使用 ASCII 编码的。(不过,字符串和正则表达式文字是 8 位干净的,这意味着字节 0x80 到 0xFF 会产生具有这些值的字符。)但该脚本实际上是使用 UTF-8 编码的。您需要添加use utf8;以将其告知 Perl。
您还需要对输出进行编码,因为 STDOUT 默认情况下需要字节。您可以通过使用来做到这一点use open \':std\', \':encoding(UTF-8)\';。