Jump to content

Recommended Posts

Posted

Помогите любимому серверу!

Подскажите, как определить, в какой кодировке пришли данные скрипту?

С наилучшими пожеланиями, Никита Мищенко.

  • 2 weeks later...
Posted

Либо по content-type запроса

Content-type: ....;charset=win-1251

Либо статистическим анализом (только он часто Mac и Win1251 путает по причине их похожести).

Posted

Хмм...

Ну первый способ ясен - через регэкспы обрезать кодировку и смотреть что и как... Но имхо это не всегда будет правильно работать?..

А алгоритм этого самого статистического анализа не подскажешь? Даже понятия не имею, что это за рыбина такая и с чем ее едят...

Можно и кусок сырца (ну в смысле кода) на перле желательно выслать мне на мыло :о)

Posted

Ну кода я не вышлю, и уж тем более не на перле (знаю и 3 года писал на нем, но не люблю).

Тема такая ... если текст более менее большой и содержит в себе русский текст (все что с кодом <128 вообще не волнует), то есть некторая статистика повторения символов с кодами >=128.

Популярных кодировок вообще всего 5: koi, win, iso, mac, dos (поддержку остальных добавить на раз).

Берешь _здоровый_ русский текст в известной кодировке (Война и мир), прогоняешь через частотный анализ (считаешь кол-во символов каждого кода (128-255) и делишт на общее кол-во символов в диапазоне 128-255), получаешь табличку из 128 элементов. Это делается один раз, и лучше считать double-ами.

Потом берешь текст, и конвертишь его из всех кодировок которые ты знаешь в ту, которой был исходный текст (война и мир:), и делаешь тот же анализ на него. Затем считаешь среднее расхождение между полученной таблицей и оригинальной и выбираешь ту кодировку, у которой разница меньше всего.

Если проверяемый текст маленький можно брать масимальное отклонение вместо среднего. Кроме этого, можно сделать 3 оригинальные таблицы для номального текста, текста написанного только строчными буквами и текста написанного только ghjbcysvb буквами. Дает хорошие результаты, если не брать кодировку mac ( она от win регистром отличается в основном). Кроме того есть еще буква 'ё', которая может находиться не там где надо Smile В связи с этим лучше ее из анализа исключать вообще.

Используя данный алгоритм в свое время был написан автоматический перекодировщик, который из белиберды (максимум 5 перекодировок текста конвертерами, вплоть до бреда win->iso/dos->win/iso->win/koi->iso/win->iso достать из этого бреда нормальный текст.

~83% вероятности полного совпадения, в любом слчае нормальная читабельность при такой цепочке из 5 перекодировок. Если их <= 3 то вообще 100% (может пробовал мало ? Smile а в твем случае глюк может быть только если маленький текст или не осмысленный.

Posted

Н-да... Задачка не из легких...

Но главное - все понятно! :о)

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...