Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Различные кодировки символов в одном файле (http://forum.oszone.net/showthread.php?t=140548)

EvgeniyQQQ 19-05-2009 14:14 1122306

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

pva 20-05-2009 08:06 1122926

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 1123177

Цитата:

Цитата pva
1. wordpad умеет (открываешь как текст dos, сохраняешь как ansi) »

Забыл уточнить. Кодировки: windows-1251 и utf-8.

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

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


Цитата:

Цитата pva
2. есть функции OemToCharBuff и CharToOemBuff »

http://msdn.microsoft.com/ru-ru/libr...s,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 1123669

Цитата:

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

Это не UTF-8, это стандартный глюк, пришедший со времён windows 3.11, когда перевод в уникод делается не функцией AnsiCharToMultibyte с правильной кодировкой, а просто превращением (reinterpret_cast) однобайтного кода символа в 2-байтный добавлением нулевого старшего байта.
В UTF-8 и обратно можно перевести блокнотом. Если нужен алгоритм, он есть в каком-то из постов на форуме, сделай поиск.
Функции OemToCharBuff и CharToOemBuff были приведены к фразе:
Цитата:

Цитата EvgeniyQQQ
Есть ли (не важно у какого языка программирования) готовый инструментарий (функция к примеру) с помощью которого можно выполнить правильное преобразование »

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


Время: 12:55.

Время: 12:55.
© OSzone.net 2001-