为什么 binmode 作为 raw 会产生元音变音?能否详细说明“Zurich”字符串如何在 Perl 内部存储?只是有点失落。
use strict;
use warnings;
my $filename = "result-test-encoding-raw.xml";
open(my $fh,'>', $filename) or die "die";
#binmode $fh, ':utf8'; #bad umlaut
binmode $fh, ':raw'; #good umlaut
print $fh '<?xml version="1.0" encoding="UTF-8"?>';
print $fh '<node>';
my $line_text = 'Zürich';
print $fh $line_text;
print $fh ' next ';
$line_text = 'Zürich';
print $fh $line_text;
print $fh '</node>';
close($fh);
最佳答案
您缺少 use utf8;
,它告诉 Perl 您的源代码是使用 UTF-8 编码的。
默认情况下,源文件应使用 US-ASCII 进行编码。
如果您使用 UTF-8 对源文件进行编码,但没有将其告知 Perl(通过使用
use utf8;
),Perl 会将其视为使用 US- 编码ASCII。对于字符串文字,Perl 将简单地将字节映射到字符串字符(而不是拒绝非 ASCII 字符)。这意味着$line_text
包含5A.C3.BC.72.69.63.68
。当您将这些字符传递给带有编码层的文件句柄时,编码层会将这些字符视为 Unicode 代码点 (
Zürich
),并生成适当的字节来表示这些字符。如果您使用 UTF-8 对源文件进行编码,并且您将此告诉 Perl(通过使用
use utf8;
),Perl 会将其视为使用 UTF-8 编码(相应地对其进行解码)。这意味着$line_text
包含5A.FC.72.69.63.68
。当您将这些字符传递给带有编码层的文件句柄时,编码层会将这些字符视为 Unicode 代码点 (
Zürich
),并生成适当的字节来表示这些字符。
use strict;
use warnings;
use utf8; # Source code is encoded using UTF-8.
use open ':std', ':encoding(UTF-8)'; # Terminal expects UTF-8. Default encoding for files.
my $filename = "result-test-encoding-raw.xml";
open(my $fh, '>', $filename)
or die("Can't create \"$filename\": $!\n");
...
print $fh 'Zürich';
...
请注意,我使用 :encoding(UTF-8)
而不是 :utf8
。后者是不正确的,尽管两者在本例中看起来是等效的。
关于xml - Perl utf8 binmode 意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46063174/