perl - 如何解码 utf 8 中的实体

标签 perl utf-8 decode html-entities

在 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/

相关文章:

regex - 替换中未初始化的反向引用

regex - 在 perl 中,我如何获得所有匹配的结果/g?

php - UTF-8贯穿始终

php - UTF-8贯穿始终

delphi - 如何正确解码 Google Translate API 答案?

c - 如何使用 Perl 从文件中去除多行 C 注释?

perl - Perl不一致的负零结果

c++ - 如何使用 C++ 将 utf-8 字符写入文件

c - 编码/解码程序的逻辑错误 (C)

java - 编码Base64找不到符号错误