如何在 utf8 中 decode_entities

how to decode_entities in utf8

在 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 符号(例如 µ)不会被转换为乱码?

您正在使用编码 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”,或者一些类似的连接字节)。

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

这不是一个措辞很好的问题。您没有告诉我们您的 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');

运行 这将为您提供正确的字符串,但您也会收到警告。

Wide character in 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 以了解它是如何工作的。