硬编码阿拉伯字母为何与Unicode码点值不一致?
阿拉伯文本硬编码时Perl码点异常问题
在Linux Mint的Xed编辑器中编写Perl代码时,直接硬编码阿拉伯字母「ن」会得到错误的Unicode码点,但读取文本文件中的该字母却能获得正确值U+0646。以下是测试代码及输出:
测试代码
my $noon = "ن"; my $code_point = charinfo(ord($noon))->{'code'}; print "Unicode code point for 'ن' (noon): U+$code_point\n"; $noon = "\N{U+0646}"; $code_point = sprintf("%04X", ord($noon)); print "Unicode code point for 'ن' (noon): U+$code_point\n"; $noon_code = 0x0646; print (chr($noon_code), "\n");
代码输出
Unicode code point for 'ن' (noon): U+00D9 Unicode code point for 'ن' (noon): U+0646 Wide character in print at code.pl line 11. ن
问题原因
这是因为Xed编辑器保存代码文件时未使用UTF-8编码,导致硬编码的阿拉伯字母被转换成了其他编码的字节(比如ISO-8859-1)。Perl默认按系统编码解析源代码,因此读取到错误的码点U+00D9(对应ISO-8859-1中的0xD9字节)。而通过\N{U+0646}或十六进制值0x0646直接指定Unicode码点时,Perl能正确识别目标字符。
解决办法
- 设置编辑器编码:在Xed编辑器中,将文件编码设为UTF-8。可在保存文件时的对话框中选择「UTF-8」编码,或在编辑器设置中把默认编码改为UTF-8。
- 添加Perl编码声明:在代码开头加入以下语句,告诉Perl源代码使用UTF-8编码,同时设置输出为UTF-8以避免宽字符警告:
use utf8; use open qw(:std :utf8);
修改后的示例代码
use utf8; use open qw(:std :utf8); use Unicode::UCD qw(charinfo); my $noon = "ن"; my $code_point = charinfo(ord($noon))->{'code'}; print "Unicode code point for 'ن' (noon): U+$code_point\n"; $noon = "\N{U+0646}"; $code_point = sprintf("%04X", ord($noon)); print "Unicode code point for 'ن' (noon): U+$code_point\n"; my $noon_code = 0x0646; print chr($noon_code), "\n";
修改后运行代码,两次输出的码点都会是U+0646,且不会出现「Wide character in print」警告。
内容的提问来源于stack exchange,提问作者Valter Ekholm
相关产品推荐
相关产品推荐

