xml - Perl utf8 binmode 意外结果

标签 xml perl utf-8

为什么 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&#252;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/

相关文章:

c - 如何在 OSX 上的 C 程序中处理(推测的)UTF-8 字符串

xml - 使用 Groovy (gpath) 获取 XML 属性的值

php - 使用 php 从 .USX 文件中获取数据

perl - 'echo' 在 perl 变量声明中做什么?

database - 使用 Perl,如何使用 dbh csv_tables 从标准输入读取 CSV 字符串?

php - 如何从 php 中的字符串中去除 unicode 字符 (LEFT_TO_RIGHT_MARK)

java - 如何在 Java 中将 UTF-8 表示解析为字符串?

c++ - 使用 tinyxml 在 C++ 中解析 xml

c# - 无法更改 XmlWriter 的设置

perl - 为什么这行 Perl 代码会抛出数字 gt 警告?