perl - 我正确使用 utf8::is_utf8 吗?

标签 perl utf-8 decode

这是否正常工作?有些错误信息已经解码,有些需要解码才能得到正确的输出。

#!/usr/bin/env perl
use warnings;
use strict;
use utf8;
use open qw(:utf8 :std);
use Encode qw(decode_utf8);

# ...

if ( not eval{
    # some error-messages (utf8) are decoded some are not
    1 }
) {
    if ( utf8::is_utf8 $@ ) {
        print $@;
    }
    else {
        print decode_utf8( $@ );
    }
}

最佳答案

Am I using utf8::is_utf8 correctly?

没有。 utf8::is_utf8 的任何使用都是不正确的,因为你永远不应该使用它!使用 utf8::is_utf8 猜测字符串的语义是所谓的 The Unicode Bug 的实例。 . utf8::is_utf8 除了在调试 Perl 或 XS 模块时检查变量的内部状态外,没有任何用处。

它不表示变量中的值是否使用 UTF-8 编码。事实上,这是不可能可靠地知道的。例如,"\xC3\xA9" 是否生成使用 UTF-8 编码的字符串?好吧,没有办法知道!这取决于我的意思是 "é""é" 还是完全不同的东西。

如果变量可能同时包含编码和解码字符串,则由您决定使用第二个变量来跟踪它。不过,我强烈建议不要这样做。只需解码从外部传入的所有内容。

如果你真的不能,你最好尝试解码 $@ 并忽略错误。它是 very unlikely不是 UTF-8 的可读内容将是有效的 UTF-8。

# $@ is sometimes encoded. If it's not,
# the following will leave it unchanged.
utf8::decode($@);

print $@;

关于perl - 我正确使用 utf8::is_utf8 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14579560/

相关文章:

perl - 我是否需要在 Windows 上的 Perl 脚本中包含 #!/usr/bin/perl 行?

perl - 由于缺少 perl 模块,在 Windows 10 上使用 LaTeX Workshop 在 VSCode 上格式化文档时出错

perl - 为什么用两个参数调用 T::fn2 时只有一个参数?

mysql - 在 MySQL 中存储表情符号时出现编码问题 : How can I define a character collation in NodeJS using Prisma ORM?

json - 使用decodable进行自定义json解码

python - 文件包含\u00c2\u00a0,转换为字符

javascript - 使用 Node Js 将 bin 文件解码为 mp3

linux - 用于字符串和打印的 Grep 目录的 Perl 脚本

python - 如何打开包含 utf-8 非编码字符的文件?

unicode - 如何在 LaTeX 中的中文字符上获得重音符号(作为声调标记)?