Perl HTML编码命名实体

时间:2013-07-05 10:15:08

标签: perl character-encoding entities

我想编码特殊字符'到他们的命名实体。

我的代码:

use HTML::Entities;
print encode_entities('“');

期望的输出:

“

而不是:

“

有没有人有想法?问候

3 个答案:

答案 0 :(得分:4)

  • 如果您不使用use utf8;,则应使用iso-8859-1(或子集US-ASCII)对文件进行编码。

    在iso-8859-1的字符集中找不到

    «“»。

  • 如果您使用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