答案取决于您想如何使用标题。有 3 种基本方法可供选择:
如果您想要将 UTF-8 编码的字符串存储在应用程序之外(无论是存储在磁盘上还是通过网络发送或任何超出程序范围的内容),则应使用这种格式。
字符的概念是 Perl 内部的。当你表演时Encode::decode_utf8
,然后尝试将一堆字节转换为字符串,如 Perl 所示。 Perl VM(以及编写 Perl 代码的程序员)无法具体化该概念,除非在输入上解码 UTF-8 字节并在输出上将它们编码为 UTF-8 字节。例如,您的程序接收两个字节作为输入,您知道它们代表 UTF-8 编码的字符,比方说0xC3 0xB6
。在这种情况下decode_utf8
返回一种表示形式,该表示形式不是两个字节,而是一个字符:ö
.
然后您可以继续在 Perl 中操作该字符串。为了进一步说明差异,请考虑以下代码:
my $bytes = "\xC3\xB6";
say length($bytes); # prints "2"
my $string = decode_utf8($bytes);
say length($string); # prints "1"
由于您有宽字符警告,这意味着您正在尝试操作(可能输出)无法表示为 ASCII 或 ISO-8859-1 的 Unicode 字符。
如果您不需要将 XML 文档中的标题作为字符串进行操作,我建议您将其保留为 UTF-8 字节(我会提到您应该小心,不要在字符串中混合字节和字符)。如果您确实需要操作它,请解码、操作并在输出时以 UTF-8 对其进行编码。
如需进一步阅读,请使用perldoc
学习perlunitut http://perldoc.perl.org/perlunitut.html, perlunifaq http://perldoc.perl.org/perlunifaq.html, perlunicode http://perldoc.perl.org/perlunicode.html, perluniintro http://perldoc.perl.org/perluniintro.html, and Encode https://metacpan.org/pod/Encode.