【问题标题】:Wide characters and Unicode encoding宽字符和 Unicode 编码
【发布时间】:2020-02-04 06:32:46
【问题描述】:

我的 Perl 代码将一些 POST 数据打印到日志文件中。

有时我会遇到以下错误:

宽字符打印在...

我意识到编码存在一些问题。 所以我添加了以下几行:

use open ':std', ':encoding(UTF-8)';
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';

但是随后错误变成了另一种错误,消息如下:

"\xFF" 不映射到 Unicode

那么什么是让它工作的正确方法呢?

【问题讨论】:

  • 您可能正在打印一些非 utf8 数据。请检查 POST 数据是否为有效的 UTF8。另见Encode
  • 能否给我们看一下打开日志文件句柄的代码?
  • @HåkonHægland - 我不知道,因为我看不到会发生什么。这就是我尝试将其打印到日志文件的原因。有没有办法安全地打印混合数据,utf-8non-uft-8 数据?
  • @GMB - open LOG, '>>', log_file; binmode LOG, ':utf8';
  • 提示::std 导致 binmode 用于提供层的 STDIN、STDOUT 和 STDERR,因此无需显式调用 binmode

标签: perl unicode utf-8


【解决方案1】:
use open ':std', ':encoding(UTF-8)';

执行以下操作:

  • 如果没有向open 传递任何层,则导致后续在同一范围内使用open 添加:encoding(UTF-8)

  • 导致执行以下操作:

    binmode(STDIN,  ':encoding(UTF-8)');
    binmode(STDOUT, ':encoding(UTF-8)');
    binmode(STDERR, ':encoding(UTF-8)');
    

问题是 STDIN 不应该被解码。

解决方案 #1

use open ':std', ':encoding(UTF-8)';
BEGIN { binmode(STDIN); }

解决方案 #2

use open ':encoding(UTF-8)';
BEGIN {
   binmode(STDOUT, ':encoding(UTF-8)');
   binmode(STDERR, ':encoding(UTF-8)');
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多