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