PDA

Показать полную графическую версию : Различные кодировки символов в одном файле


EvgeniyQQQ
19-05-2009, 14:14
Добрый день. Подскажите пожалуйста.
Есть текстовый файл в котором текстовая информация (кирилица) представлена в 2х разных кодировках. Текстовые редакторы, такие как Notepad++ и UltraEdit отображают текст правильно (то есть, они своими "мозгами" понимают, что текст представлен в различных кодировках), но при попытке сохранить файл в конкретной (одной) кодировке они выполняю преобразование не верно.
Вопрос в следующем. Есть ли (не важно у какого языка программирования) готовый инструментарий (функция к примеру) с помощью которого можно выполнить правильное преобразование. Или может кто предложет примерный "алгорит" преобразования. Или возможно существуют приложения умеющие выполнять подобные преобразования. :)

pva
20-05-2009, 08:06
1. wordpad умеет (открываешь как текст dos, сохраняешь как ansi)
2. есть функции OemToCharBuff и CharToOemBuff
3. алгоритм: в досе символы с кодами >127 сосредоточены в диапазоне кодов 128-175 и 224-239, остальное - пунктуация; в виндоус в диапазоне 192-255.
На этом примере строим научно-обоснованный алгоритм. Берём повесть о войне и мире, считаем статистику по символам. Открываем wordpad-ом, сохраняем в DOS, считаем статистику (Она будет такой же, только в другом порядке). Теперь открываем неизвестный файл, считаем статистику. По любой норме (лучше L2 - евклидова) считаем расстояние полученного 256-мерного вектора до двух эталонных. Какое меньше - та кодировка и есть.

EvgeniyQQQ
20-05-2009, 15:11
1. wordpad умеет (открываешь как текст dos, сохраняешь как ansi) »
Забыл уточнить. Кодировки: windows-1251 и utf-8.

вот пример (обе строки находятся в одном и том же файле):

Стандартные изделия
Ñòàíäàðòíûå èçäåëèÿ


2. есть функции OemToCharBuff и CharToOemBuff »
http://msdn.microsoft.com/ru-ru/library/ms647494(en-us,VS.85).aspx:
[in] Pointer to a buffer containing one or more characters from the OEM-defined character set.
Определённого типа!!! А вопрос как раз в том, что я не знаю как отличить какой байт в файле к какой кодировке относится.

pva
21-05-2009, 06:49
Стандартные изделия
Ñòàíäàðòíûå èçäåëèÿ »
Это не UTF-8, это стандартный глюк, пришедший со времён windows 3.11, когда перевод в уникод делается не функцией AnsiCharToMultibyte с правильной кодировкой, а просто превращением (reinterpret_cast) однобайтного кода символа в 2-байтный добавлением нулевого старшего байта.
В UTF-8 и обратно можно перевести блокнотом. Если нужен алгоритм, он есть в каком-то из постов на форуме, сделай поиск.
Функции OemToCharBuff и CharToOemBuff были приведены к фразе:
Есть ли (не важно у какого языка программирования) готовый инструментарий (функция к примеру) с помощью которого можно выполнить правильное преобразование »

Отличить UTF-8 от остальных кодировок можно всё тем же способом статистического разделения (по наименьшему расстоянию). Там для русского языка будет один-два наиболее часто встречающихся символа.




© OSzone.net 2001-2012