Perl utf8 binmode意外结果

保利

为什么binmode原始会产生变音符号?是否可以详细说明Perl内部如何存储“ Zurich”字符串?只是有点迷路了。

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后者是不正确的,即使在此示例中两者看起来相同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么mySQL结果中的Perl Hashkey名称不是UTF8?

本地“关闭” binmode(STDOUT,“:utf8”)

在Perl中打印UTF8?

perl XML :: LibXML utf8编码

Perl中将utf8转换为html实体

Perl字符串操作和utf8 / unicode

Perl意外结果

您可以使用非utf8编码编写Perl 6脚本吗?

perl:utf8 <something>不会映射到Unicode,而<something>似乎不存在

Perl中的JSON编码/解码utf8字符串

Perl中的波兰语字符[HTML :: TreeBuilder和utf8输入文件]

Perl DBI,MySQL中使用ő和ű字符的UTF8字符编码

在Perl中对utf8字符串使用“排序”

utf8似乎打破了Perl中的正则表达式规则?

二进制模式(标准输出,“:utf8”);和 Unix 行尾在 Strawberry perl

将十六进制转换为UTF8无法在Perl中按预期工作

perl-如何为每个字节打印utf8代码点

Perl的IO :: File等效于open($ fh,“>:utf8”,$ path)是什么?

Perl和HTML:UTF8在表单中不起作用

一个或多个UTF8字段包含非UTF 8数据,编辑可能会产生意外的结果

为什么在带有“ use utf8”的UTF-8编码的Perl脚本中无法识别出变音符号?

命令行Perl正则表达式替换:替换字符串包含utf8

如何在Perl中将字符序列(十六进制)打印为UTF8字符?

如何在Perl中将带重音符号和其他外来字符编码为UTF8

Perl-while循环的意外结果

相同的代码,在不同的机器上,关于UTF8字符的结果不同

为什么在单行内的perl替代项和match(m)运算符中使用utf8模式不起作用?

Perl中替换正则表达式的意外结果

perl的$-[0]对于非ASCII数据产生意外结果