2014-12-19 3 views
0

У меня есть этот скрипт. Somefile.xsd - это файл, содержащий несколько символов UTF-8. Однако я обнаружил, что не могу получить guess_encoding, чтобы сообщить ту же кодировку, что и Encode :: Guess-> guess. Игнорируя факт, что это XSD, какая очевидная вещь (и я уверен, что это, вероятно, очевидно), я пропустил, что я еще не сделал?Encode :: Guess-> guess дает разные результаты для guess_encoding

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

Edited уточнить: Я хочу использовать версию guess_encoding со вторым вариантом (т.е. список подозреваемых) , Удаление списка не дает мне ничего, кроме звонка Encode::Guess->guess. Вариант использования заключается в том, что я хочу проверить, что файл соответствует одному из наборов кодировок, а передача действительного списка выглядит более элегантно, чем называть угадать и смотреть имя в списке, особенно когда у меня было $encoding->name. результат iso-8859-15 or utf8, что означает, что я не могу просто проверить равенство против списка.

ответ

0

Try удаления КЯ:

$encoding2 = guess_encoding($text); 

Это должно дать вам правильный ответ.

EDIT.

Выполнение этого кода:

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"/> 
---------------------------------------- 
+0

Так почему же guess_encoding терпят неудачу? Документы говорят, что второй параметр - это список подозреваемых, которые будут проверены. Я перечисляю UTF-8, кодировка UTF-8, что мне не хватает? Весь смысл предоставления списка подозреваемых заключается в том, что вам не нужно проверять каждого подозреваемого. В моем случае я хочу ограничить список, поскольку мне нужны только специальные кодировки, так как я хочу обрабатывать остальные как условие ошибки - предоставление подозрительного списка кажется более элегантным, чем проверка возвращаемой строки. –

 Смежные вопросы

  • Нет связанных вопросов^_^