[Unicode, UTF-8] Русские буквы - что за...?
пример в студию.
от локали зависит?
Попробовал такой скрипт:
use Encode;Отработал нормально. Если не вызывать decode, то как и следовало ожидать, результат для буквы "а" (в виндовой кодировке) будет C3 A0 (U+00E0).
my $line = <>;
$line = decode("cp1251", $line);
binmode(STDOUT, ":utf8");
print $line;
ты уверен, что у тебя вход в виндовой кодировке (cp1251 а не в дос-овской(cp866) или koi8r?
Абсолютно. Я на STDIN подаю файл в виндовой кодировке, а не ввожу из консоли, у которой выставлена досовская кодировка. (E0 как раз и есть код русской маленькой буквы "а" в виндовой кодировке.)
Вот такая задачка: есть последовательность байт на входе, нужно определить кодировку (single-byte).
В общем случае, это сделать невозможно (чтобы это 100% работало но если ввести дополнительное условие, что большая часть символов — буквы, то, имхо, можно построить такой алгоритм, который будет работать в большом количестве случаев правильно.
Пытался найти через google что-нибудь по этому поводу, но нашёл только несколько алгоритмов, которые выбирают кодировку для русского текста из небольшого числа либо по частоте использования русских букв, либо по частоте "попадания" символов с кодом выше 127 в некоторые диапазоны.
Есть какие-нибудь идеи куда можно копать?
В принципе, устраивают (на крайняк) и найденные, только хотелось бы иметь более общий алгоритм (не только для русских текстов) и, соответственно, с более широким набором "проверяемых" кодировок.
ты хочешь реализовать что-то вроде enca ?
http://www.artlebedev.ru/tools/decoder/
не в курсе по поводу открытости кода. Но я этим пользуюсь, когда сообщения в аську корявые приходят.
не в курсе по поводу открытости кода. Но я этим пользуюсь, когда сообщения в аську корявые приходят.
Я пишу небольшую утилиту для торрент файлов. Для этого она должна уметь их читать.
В общем, она это уже умеет, только пока что не умеет правильно читать строки.
В этих торрент файлах какая-то макагня с кодировкой. Насколько я понимаю, по умолчанию используется UTF-8, более того, для некоторых строк заведомо известна кодировка (например, строки в массиве path.utf-8). При этом даже в некоторых торрент файлах прописан encoding, а в некоторых — codepage. Но у меня есть торрент файл, в котором прописан codepage 866, но имена файлов записаны в виндовой кодировке и никаких path.utf-8, name.utf-8 там нет.
Есть какие-нибудь идеи куда можно копать?Пару лет назад, когда возникла необходимость быстро написать детектор кодировок, мы воспользовались вот этой статьёй: Language Trees and Zipping.
В принципе, устраивают (на крайняк) и найденные, только хотелось бы иметь более общий алгоритм (не только для русских текстов) и, соответственно, с более широким набором "проверяемых" кодировок.
Самое интересное то, что не используются никакие статистические данные о частоте употребления отдельных букв и пр.
За инфу по enca тоже спасибо!
Всегда ведь можно добавлять новые кодировки в проект довольно просто.
Буду думать, что выбрать.
Проект, правда, встанет... надеюсь не как в последний раз — на полгода.
IIRC одним из забавных свойств utf-8 является нормализация. Точнее, нормализации. То есть один и тот же UCS code point может быть представлен в виде разной последовательности байт, являющихся валидными утф-8 энкодингами этого самого символа. Причём там, где я про это читал, было специально упомянуто, что перл использует отличный от большинства других языков/тулзов алгоритм нормализации.
Насколько я понимаю, нужно, например, хранить тексты в различных кодировках. Когда поступает некоторый текст в неизвестной кодировке, нужно посчитать относительную энтропию с имеющимися образцами, выбрать меньшую и, соответственно, считать, что неизвестная кодировка совпадает с кодировкой данного образца.
Но ведь данный метод, как утверждают авторы, может быть использован для определения авторства текста.
Таким образом, если положить, что кодировка образца текста и исследуемого текста совпадают, но авторство (равно как и тематика) нет, то мы получим "прирост" относительной энтропии, который отрицательно скажется на определении кодировки.
Как минимизировать это влияние?
Понятно, что в образцах можно хранить один и тот же текст, но если нужно выбирать не только между русскими кодировками, авторство и, возможно, тематика изменятся.
UPD
С другой стороны, я тут подумал, что если мы имеет русский текст в некоторой кодировке, то относительная энтропия должна быть существенно больше для образцов с нерусскими кодировками (содержащими нерусские тексты). А в рамках одного языка (если образцы содержат один и тот же текст авторство (и тематика) плюс-минус окажут одинаковое влияние на относительную энтропию, при этом влияние должно быть относительно небольшим. Что фактически снимает вопрос.
Разве не очевидно, что во всех разумных сценариях влияние авторства и тематики на порядки меньше, чем кодировки?
Оставить комментарий
Serega009
Возник вот такой вот вопрос.Насколько я понимаю, в Unicode русская маленькая буква "а" кодируется как code point U+0430.
В кодировке UTF-8 эта буква записывается в два байта: D0 B0.
При этом Perl при выводе в файл в кодировке UTF-8 представляет эту букву как последовательность байт C3 A0.
Как всё это понимать?