【问题标题】:how to decode_entities in utf8如何在 utf8 中解码实体
【发布时间】:2016-10-30 02:12:47
【问题描述】:

在 perl 中,我正在使用以下 utf-8 文本:

my $string = 'a 3.9 kΩ resistor and a 5 µF capacitor';

但是,当我运行以下命令时:

decode_entities('a 3.9 kΩ resistor and a 5 µF capacitor');

我明白了

a 3.9 kΩ resistor and a 5 µF capacitor

符号已成功解码,但 µ 符号现在前面有乱码。

如何在使用 decode_entities 的同时确保未编码的 utf-8 符号(例如 µ)不会被转换为乱码?

【问题讨论】:

    标签: perl utf-8 decode html-entities


    【解决方案1】:

    您正在使用编码 CPAN 库。如果是真的,你可以试试这个……

    my $string = "...";
    $string = decode_entities(decode('utf-8', $string));
    

    这似乎不合逻辑。如果 Perl 本身是 UTF-8 本身,为什么需要解码 UTF-8 字符串?这只是告诉 Perl 你有一个 UTF-8 值,它需要将其解释为原生 UTF-8 的另一种方式。

    您看到的损坏是 UTF-8 值没有识别出正确的字节(Dumpered 时它显示“0xC1 0xAF”;经过上述更改后,它应该显示“0x1503”或一些类似的 concat 'ed 字节)。

    在 perl 中有很多设置会影响这一点。以上很可能是您对给定设置所需的更改的正确组合。否则,上面的一些变化(用 decode('latin1', ...) 等交换编码)应该可以解决问题。

    【讨论】:

    • 这对我有用,谢谢。我会在几分钟内接受答案。奇怪的是,当我稍后在脚本中运行url_encode($string) 时,我现在收到“宽字符”警告。但我想这是一个全新的问题。
    【解决方案2】:

    这不是一个措辞很好的问题。你没有告诉我们你的 decode_entities() 函数来自哪里,你也没有给出一个简单的例子让我们可以运行来重现你的问题。

    但是我能够用这段代码重现你的问题:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use 5.010;
    
    use HTML::Entities;
    
    say decode_entities('a 3.9 kΩ resistor and a 5 µF capacitor');
    

    这里的问题是,默认情况下,Perl 会将您的源代码(以及因此包含在其中的任何字符串)解释为 ISO-8859-1。由于您的字符串是 UTF8 格式,您只需要通过在代码中添加 use utf8 来告诉 Perl 将您的源代码解释为 UTF8。

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use 5.010;
    
    use utf8; # Added this line
    
    use HTML::Entities;
    
    say decode_entities('a 3.9 kΩ resistor and a 5 µF capacitor');
    

    运行它会给你正确的字符串,但你也会得到一个警告。

    say 中的宽字符

    这是因为 Perl 的 IO 层默认需要单字节字符,任何通过它发送多字节字符的尝试都被视为潜在问题。你可以通过告诉 Perl STDOUT 应该接受 UTF8 字符来解决这个问题。有很多方法可以做到这一点。最简单的可能是将-CS 添加到shebang 行。

    #!/usr/bin/perl -CS
    
    use strict;
    use warnings;
    use 5.010;
    
    use utf8;
    
    use HTML::Entities;
    
    say decode_entities('a 3.9 kΩ resistor and a 5 µF capacitor');
    

    Perl 对 Unicode 有很好的支持,但是很难开始使用它。我建议阅读 perlunitut 以了解它是如何工作的。

    【讨论】:

    • 这并不完全正确。如果没有use utf8,perl 会将输入文件解释为字节,而不是 ISO-8859-1。
    猜你喜欢
    • 2017-04-09
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多