【问题标题】:Encode::Guess->guess gives different results to guess_encodingEncode::Guess->guess 给guess_encoding不同的结果
【发布时间】:2014-12-19 13:36:57
【问题描述】:

我有这个脚本。 Somefile.xsd 是一个包含几个 UTF-8 字符的文件。然而,我发现我无法让guess_encoding 报告与 Encode::Guess->guess 相同的编码。忽略它是 XSD 的事实,我错过了什么明显的事情(我相信这可能很明显)我还没有做过?

use Encode;
use Encode::Guess;

open (FILE, "<", "somefile.xsd");

print ("Reading file...\n");
#$text = <FILE>;
while ($text = <FILE>) {
    $encoding1 = Encode::Guess->guess($text);
    if (ref($encoding1)) {
        $name = $encoding1->name;
        print "$name : $text" if ($name ne "ascii");
    } else {
        print ("Not found : $text");
    }

    $encoding2 = guess_encoding($text, qw/iso-8859-15 ascii iso-8859-1 utf8/);
    if (ref($encoding2)) {
        $name = $encoding2->name;
        print "$name : $text" if ($name ne "ascii");
    } else {
        print ("Not found : $text");
    }

}

close(FILE);

当我运行它时,它会给出以下结果:

H:\play>perl encoding.pl
Reading file...
utf8 :                  <xs:enumeration value="Bokmål, Norwegian; Norwegian Bokmål"/>
Not found :                     <xs:enumeration value="Bokmål, Norwegian; Norwegian Bokmål"/>
utf8 :                  <xs:enumeration value="Occitan (post 1500); Provenæ ¬"/>
Not found :                     <xs:enumeration value="Occitan (post 1500); Provenæ ¬"/>
utf8 :                  <xs:enumeration value="Volapük"/>
Not found :                     <xs:enumeration value="Volapük"/>

编辑澄清:我想使用带有第二个选项的guess_encoding 版本(即嫌疑人列表)。删除列表对我来说只是调用Encode::Guess-&gt;guess。用例是我想检查一个文件是否与一组编码中的一个匹配,并且传递有效列表似乎比调用guess 并在列表中查找名称更优雅,特别是当我有$encoding-&gt;name give我是iso-8859-15 or utf8 的结果,这意味着我不能简单地检查列表是否相等。

【问题讨论】:

    标签: perl character-encoding


    【解决方案1】:

    尝试删除 qw:

    $encoding2 = guess_encoding($text);
    

    这应该会给你正确的答案。

    编辑。

    运行此代码:

    use Encode;
    use Encode::Guess;
    
    open (FILE, "<", "somefile.xsd");
    
    print ("Reading file...\n");
    #$text = <FILE>;
    while ($text = <FILE>) {
        $encoding1 = Encode::Guess->guess($text);
        if (ref($encoding1)) {
            $name = $encoding1->name;
            print "$name : $text" if ($name ne "ascii");
        } else {
            print ("Not found : $text");
        }
    
       $encoding2 = guess_encoding($text, qw/iso-8859-15 ascii iso-8859-1 utf8/);
    
        if (ref($encoding2)) {
            $name = $encoding2->name;
            print "$name : $text" if ($name ne "ascii");
        } else {
            print ("Not found : $text");
        }
    
       $encoding3 = guess_encoding($text);
    
        if (ref($encoding3)) {
            $name = $encoding3->name;
            print "$name : $text" if ($name ne "ascii");
        } else {
            print ("Not found : $text");
        }
    
        print "-"x40 ."\n";
    }
    
    close(FILE);
    

    产生:

    Reading file...
    utf8 : <xs:enumeration value="Bokmål, Norwegian; Norwegian Bokmål"/>
    Not found : <xs:enumeration value="Bokmål, Norwegian; Norwegian Bokmål"/>
    utf8 : <xs:enumeration value="Bokmål, Norwegian; Norwegian Bokmål"/>
    ----------------------------------------
    utf8 : <xs:enumeration value="Bokmål, Norwegian; Norwegian Bokmål"/>
    Not found : <xs:enumeration value="Bokmål, Norwegian; Norwegian Bokmål"/>
    utf8 : <xs:enumeration value="Bokmål, Norwegian; Norwegian Bokmål"/>
    ----------------------------------------
    utf8 : <xs:enumeration value="Occitan (post 1500); Provenæ ¬"/>
    Not found : <xs:enumeration value="Occitan (post 1500); Provenæ ¬"/>
    utf8 : <xs:enumeration value="Occitan (post 1500); Provenæ ¬"/>
    ----------------------------------------
    utf8 : <xs:enumeration value="Occitan (post 1500); Provenæ ¬"/>
    Not found : <xs:enumeration value="Occitan (post 1500); Provenæ ¬"/>
    utf8 : <xs:enumeration value="Occitan (post 1500); Provenæ ¬"/>
    ----------------------------------------
    utf8 : <xs:enumeration value="Volap├╝k"/>
    Not found : <xs:enumeration value="Volap├╝k"/>
    utf8 : <xs:enumeration value="Volap├╝k"/>
    ----------------------------------------
    utf8 : <xs:enumeration value="Volap├╝k"/>
    Not found : <xs:enumeration value="Volap├╝k"/>
    utf8 : <xs:enumeration value="Volap├╝k"/>
    ----------------------------------------
    

    【讨论】:

    • 那么为什么guess_encoding会失败呢?文档说第二个参数是要测试的嫌疑人名单。我列出了 UTF-8,编码是 UTF-8,我错过了什么?提供嫌疑人名单的全部意义在于,您不必逐个调查嫌疑人。就我而言,我想限制列表,因为我只想要特定的编码,因为我想将其他编码作为错误条件处理 - 提供可疑列表似乎比检查返回的字符串更优雅。
    猜你喜欢
    • 2019-04-08
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多