我想编码特殊字符'到他们的命名实体。
我的代码:
use HTML::Entities;
print encode_entities('“');
期望的输出:
“
而不是:
“
有没有人有想法?问候
答案 0 :(得分:4)
如果您不使用use utf8;
,则应使用iso-8859-1(或子集US-ASCII)对文件进行编码。
«“»。
如果您使用use utf8;
,则应使用UTF-8对文件进行编码。
«“»在UTF-8的字符集中找到,Unicode。
您表示您的文件未保存为UTF-8,因此就Perl而言,您的源文件不可能包含«“»。
你可能会使用cp1252编码你的文件,这是iso-8859-1的扩展,增加了«“»。这不是一个有效的选择。
选项:
[最佳选项]将文件另存为UTF-8并使用以下内容:
use utf8;
use HTML::Entities;
print encode_entities('“');
将文件另存为cp1252,但仅使用US-ASCII字符。
use charnames ':full';
use HTML::Entities;
print encode_entities("\N{LEFT DOUBLE QUOTATION MARK}");
或
use HTML::Entities;
print encode_entities("\N{U+201C}");
或
use HTML::Entities;
print encode_entities("\x{201C}");
[不推荐]将文件另存为cp1252并明确解码文字
use HTML::Entities;
print encode_entities(decode('cp1252', '“'));
Perl看到了:
use HTML::Entities;
print encode_entities(decode('cp1252', "\x93"));
答案 1 :(得分:2)
Perl不知道源文件的编码。如果您包含任何特殊字符,则应始终使用UTF-8
- 编码并将其保存
use utf8;
位于代码顶部。这将确保您的字符串文字包含代码点,而不仅仅是字节。
答案 2 :(得分:1)
我遇到了同样的问题并应用了上述所有提示。它在我的perl脚本(CGI)中工作,例如ä = encode_entities("ä")
产生了正确的结果。然而,应用encode_entities(param("test"))
将编码单个字节。
我找到了这个建议:http://blog.endpoint.com/2010/12/character-encoding-in-perl-decodeutf8.html
把它放在一起这是我的解决方案,最终有效:
use CGI qw/:standard/;
use utf8;
use HTML::Entities;
use Encode;
print encode_entities(decode_utf8(param("test")));
我不清楚为什么要这样做,但它确实有效。 HTH