【问题标题】:Perl wrong UTF-8 outputPerl 错误的 UTF-8 输出
【发布时间】:2022-01-06 18:18:08
【问题描述】:

我有以下程序:

#! /usr/bin/perl
use strict;
use warnings;
use utf8;

print "\x{00a0}\n";

当我运行它时,它会产生错误的 UTF-8 编码:

$ ./nbsp.pl | od -tx1
0000000 a0 0a
0000002

我的期望是这样的:

$ printf '\u00a0\n' | od -tx1
0000000 c2 a0 0a
0000003

为什么00a0 编码为a0 而不是应该的c2a0

当我尝试解析 JSON 数据时,也会发生同样的情况:

#! /usr/bin/perl
use strict;
use warnings;
use JSON::Parse qw(parse_json);

my $json = parse_json ('{"nbsp":"\u00A0"}');
print $json->{nbsp}, "\n";

【问题讨论】:

    标签: perl encoding utf-8


    【解决方案1】:

    它不需要utf8 pragma,而是一个对输出进行编码的语句。最好用open pragma

    use strict;
    use warnings;
    
    use open ":std", ":encoding(UTF-8)";
    
    print "\x{00a0}\n"; 
    

    【讨论】:

    • 但是我的语言环境已经设置为 UTF-8。为什么我必须告诉 Perl 两次?不使用 UTF-8 的系统又如何呢?如果我强制使用 UTF-8,脚本将无法在这样的系统上运行。
    • @ceving Perl 不会查看语言环境来确定默认编码,除非您通过 use open ':locale'; 或其他方式告诉它。
    • -C 切换到 perl 对于在标准文件句柄上设置默认编码也很有用。
    • 我喜欢use utf8::all;,它设置了文件句柄和其他我经常忘记的其他utf8内容。
    猜你喜欢
    • 2013-10-11
    • 2010-10-12
    • 1970-01-01
    • 2019-02-09
    • 2015-09-03
    • 2014-01-27
    • 2011-06-02
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多