在 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符号(例如µ
)不会转换为乱码?
最佳答案
这不是一个措辞很好的问题。您没有告诉我们您的 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 中的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40325464/