【问题标题】:Am I using utf8::is_utf8 correctly?我正确使用 utf8::is_utf8 吗?
【发布时间】:2013-01-29 09:29:03
【问题描述】:

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

#!/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( $@ );
    }
}

【问题讨论】:

  • 消息输出是否正确?如果是,它可能正在工作。

标签: perl utf-8 decode


【解决方案1】:

我是否正确使用了 utf8::is_utf8?

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

它不表示变量中的值是否使用 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 $@;

【讨论】:

  • @sid_com,添加到我的答案中。
  • 我同意,除了 utf8::is_utf8 可以用于解决旧 Perls 上的 Unicode 错误。可悲的是,我们仍有 5.8.8 台机器正在生产中......
  • @rjh,不,你只需要utf8::upgradeutf8::downgrade
  • @Thorsten Schöning。关于“所以是的,标志确实可以区分这一点。”,您引用的段落与我所说的完全不矛盾。文档正在讨论字符串如何在内部存储,这在这里无关紧要。我的回答只讨论了变量的值,而不是它在内部的存储方式。
  • @ikegami 你的测试完全错了,直接在inet_aton之后打印is_utf8的结果,你会看到结果是0,因为你有一个字节数组。将其传递给encode 是错误的,因为这只适用于字符串。再次传递给decode 也是错误的,因为您没有 UTF-8 编码的字节数组,而是任意不同的东西。 decode 只是不会失败,但问题是你做出了错误的假设,而不是标志。垃圾进垃圾出。您的 2. 示例也在处理字节数组,因此无论 Unicode 是什么,0 都是预期的输出。
猜你喜欢
  • 1970-01-01
  • 2014-02-28
  • 2015-06-25
  • 2022-01-08
  • 2011-08-07
  • 2011-09-26
  • 2019-05-03
  • 2016-03-12
  • 1970-01-01
相关资源
最近更新 更多