Jim*_*nty 1 perl character-encoding
Perl中用于确定值是字节序列还是编码字符串的标准测试是什么?如果它是一个编码字符串,它的字符编码是什么?
我们假设以下完整的Perl脚本:
'foo';
Run Code Online (Sandbox Code Playgroud)
如何判断这个文字字符串是一个字节序列还是某些编码中的字符串?如果它是某些字符编码中的字符串,那么它的字符编码是什么?
这个问题与Unicode或UTF-8无关.它通常与Perl中的字节与字符有关.这个问题也不是关于自动字符编码检测,这完全是一个不同的主题.
UPDATE
在初始化之后$letter,我希望Perl告诉我它认为存储在变量中的字母是什么字符编码$letter.我不认为它必然是正确的.确保Perl理解字母编码的字符是我作为程序员的责任.我明白了.但是应该有一种简单,简单的方法来测试Perl认为字符(或字符串)所在的字符编码.不存在吗?
C:\>perl -E "$letter = 'Ž'; say $letter =~ m/\w/ ? 'matches' : 'does not match'"
does not match
C:\>perl -MEncode -E "$letter = decode('UTF-8', 'Ž'); say $letter =~ m/\w/ ? 'matches' : 'does not match'"
does not match
C:\>perl -MEncode -E "$letter = decode('Windows-1252', 'Ž'); say $letter =~ m/\w/ ? 'matches' : 'does not match'"
matches
C:\>perl -MEncode -E "$letter = decode('Windows-1252', 'Ž'); $letter = encode('Windows-1252', $letter); say $letter =~ m/\w/ ? 'matches' : 'does not match'"
does not match
C:\>chcp
Active code page: 1252
C:\>
Run Code Online (Sandbox Code Playgroud)
Perl不能按需报告它所理解的字符编码(正确或错误)存储的值$letter是什么?
与其他一些编程语言(如Python)不同,Perl不区分"字节字符串"和"Unicode字符串".所有字符串都具有Unicode语义以及字节语义.
话虽如此,在包含ASCII,ISO8859-1或二进制数据的字符串和包含Unicode数据的字符串之间存在纯粹的内部区别.这种区别是使用UTF8标志进行的,可以使用该utf8::is_utf8()函数进行检查.但是,请记住,此标志会自动设置和清除 - 例如,™在字符串中附加非ISO-8859-1字符(例如)会将字符串中的任何数据重新编码为UTF-8,如有必要,并设置UTF8标志.但是,这种转换对于纯Perl程序是不可见的,因此您很少需要查看它.
如果你有一个非Unicode字符串(例如,二进制数据),你需要弄清楚它是什么编码,请参阅如何猜测Perl中字符串的编码?.