Правильный способ обнаружения кодирования в Perl

У меня есть эти две строки:

%EC%E0%EC%E0+%EC%FB%EB%E0+%F0%E0%EC%F3
%D0%BC%D0%B0%D0%BC%D0%B0%20%D0%BC%D1%8B%D0%BB%D0%B0%20%D1%80%D0%B0%D0%BC%D1%83

Это URL-кодированная фраза на русском языке в cp-1251 и utf-8 соответственно. Я хочу видеть их на русском языке в моем терминале utf-8, используя perl. К сожалению, Perl-модуль Encode::Detect (после url-декодирования) не может обнаружить cp-1251 из первого примера. Вместо этого он предлагает это: "x-euc-tw".

Вопрос в том, как правильно определить правильную кодировку в этом случае (указав параметры локали, используя другие модули...)?

2 ответа

Решение

UTF-8 и cp1251 - единственные два варианта? Вероятность наличия текста cp1251, который также является действительным UTF-8, чрезвычайно мала. (Это было бы бредом.) Так что вы можете сделать

use Encode qw( decode );
my $decoded = eval { decode('UTF-8', $encoded, Encode::FB_CROAK) }
    // decode('cp1251', $encoded);

Это будет гораздо точнее, чем догадчик кодирования.

Encode::Detect, который использует детектор универсального набора символов Mozilla, позволяет различным тестерам набора символов просматривать данные. Затем исследователи сообщают о различных уровнях достоверности, и побеждает зонд с наибольшей достоверностью. Этот процесс зависит только от ввода; это не зависит от локали или других внешних настроек. В этом случае, по любой причине, пробник для euc-tw сообщает о более высокой достоверности, чем пробник для windows-1251, и вы ничего не можете сделать, кроме изменения данных или изменения исходного кода.

Вы можете попробовать использовать Encode::Guess что позволяет указать список кодировок на выбор.

Другие вопросы по тегам