08.08.2005, 11:19 | #1 |
Moderator
|
Вопрос больше алгоритмический.
Есть у меня входной текстовой файл, который мне нужно подгружать в БД. Допустим с кучей кратких однострочных описаний товара. Но есть проблема (эх, не люблю я это слово, пусть лучше будет "задача"). Строки описаний могут быть в разных кодировках - либо DOS(866) либо WIN(1251). Не спрашивайте почему так получилось. Задача состоит в автоматическом определении кодировки. Не подкинете идей? |
|
08.08.2005, 11:35 | #2 |
Участник
|
Как-то видел способ, основанный на подсчете русской буквы "о" в тексте. Типа если символов 174 - это DOS, если символов 238 - WIN
Не знаю как сильно тебе это поможет (это для текста хорошо, а для данных - ХЗ - там поди числа сплошные) Рассмотреть так же вариант изменения выгрузки - в имя файла добавить префикс, в начало файла добавить маркер и т.п. |
|
08.08.2005, 11:43 | #3 |
Moderator
|
"Немного подумал" © и придумал.
Во-первых, преобразуем считанную строку в UpperCase. Во-вторых, пишем в фаре алфавит в кодировке WIN и переводим его в DOS. Все символы кроме "Ё" получились с кодом большим 179. Символ "Ё" преобразовался в "и". Отсюда простой вывод: т.к. описание товара не может состоять из одного символа, то достаточно проверить строку на вхождение символа с кодом >179. Если такой символ находится, значит это DOS-строка. Иначе WIN. Если кому интересно, чуть попозже закину код |
|
08.08.2005, 14:00 | #4 |
Участник
|
Мысль несколько запутанная... Но в чем-то верная.
В кодировке DOS большие буквы идут от 0x80h до 0x9Fh, а маленькие - с 0xA0h по 0xAFh и с 0xE0h по 0xEFh, плюс буква Ё - 0xF0h и ё - 0xF1h В кодировке WIN всё проще - 0xC0h - 0xDFh -большие и сразу за ними 0xE0h - 0xFFh - маленькие, плюс "Ёё" 0xA8, 0xB8. То есть, если ASCII код знака попадает в интервал [0xC0h - 0xDFh] - это 100% WIN (в досовской кодировке там - псевдографика), если код больше 0xF1h - тоже WIN Аналогично, если ASCII код от 0x80h до 0xAFh - это ~99% DOS. Ну... Надо еще исключить отсюда букву Ё 0xA8h. Вариантов несколько - Анализировать посимвольно строку и иметь три "столбика" - в один сложим DOS, в другую - WIN, в третью - всё остальное. В конце смотрим, кого больше - DOS или WIN. По идее, должно получаться практический всё. Насчет варианта с апкейсом, предложенным выше, пока не понял, что получится... Думаю. |
|
08.08.2005, 14:13 | #5 |
Участник
|
Цитата:
Сообщение от tyrex
"Немного подумал" © и придумал.
Во-первых, преобразуем считанную строку в UpperCase. Во-вторых, пишем в фаре алфавит в кодировке WIN и переводим его в DOS. Все символы кроме "Ё" получились с кодом большим 179. Символ "Ё" преобразовался в "и". Отсюда простой вывод: т.к. описание товара не может состоять из одного символа, то достаточно проверить строку на вхождение символа с кодом >179. Если такой символ находится, значит это DOS-строка. Иначе WIN. Если кому интересно, чуть попозже закину код |
|
08.08.2005, 15:34 | #6 |
Moderator
|
Win-строка АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ представляет собой в DOS-кодировке символы псевдографики (а также возможно букву "и").
Поэтому приходим к такому алгоритму: 1. Считываем строку, предполагая что она представлена в виде DOS-кодировки. 2. Преобразуем ее в UpperCase чтобы ограничить диапазон симвопов для проверки. 2. Перебираем символы этой строки. 3. Если код символа оказывается >=179 (символ начала последовательности псевдографики), то входная строка представлена в виде Win-кодировки. <div class='CALtop'>C/AL</div><div class='CAL'>IsDosEncoding(InStr: Text): Boolean BEGIN FOR i:=1 TO LENGTH(InStr) DO IF (InStr[i] in 176..223) THEN EXIT(TRUE); EXIT(FALSE); END;</div> |
|
|
За это сообщение автора поблагодарили: mira (1). |
08.08.2005, 16:05 | #7 |
Участник
|
А если у нас там запятая, тире, точка, цифра, etc?
По этому куску кода если хоть ОДИН символ лежит в диапазоне 176..223 - строка считается DOS - зачем там сделан цикл? |
|
08.08.2005, 16:13 | #8 |
Участник
|
Цитата:
Сообщение от tyrex
Win-строка АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ представляет собой в DOS-кодировке символы псевдографики (а также возможно букву "и").
Поэтому приходим к такому алгоритму: 1. Считываем строку, предполагая что она представлена в виде DOS-кодировки. 2. Преобразуем ее в UpperCase чтобы ограничить диапазон симвопов для проверки. 2. Перебираем символы этой строки. 3. Если код символа оказывается >=179 (символ начала последовательности псевдографики), то входная строка представлена в виде Win-кодировки. <div class='CALtop'>C/AL</div><div class='CAL'>IsDosEncoding(InStr: Text): Boolean BEGIN FOR i:=1 TO LENGTH(InStr) DO IF (InStr[i] in 176..223) THEN EXIT(TRUE); EXIT(FALSE); END;</div> Цитата:
Сообщение от SVG
А если у нас там запятая, тире, точка, цифра, etc?
NB. по-умолчанию (если нет русских букв) строка будет считаться ДОСовской (если True с False, разумеется, местами поменять) |
|
08.08.2005, 17:04 | #9 |
Участник
|
Mihon
Дайте плиз таблицы. А то я запарился не глядя думать, а в яндеске навскидку нашел только досовую таблицу. |
|
08.08.2005, 17:25 | #10 |
Участник
|
Цитата:
Сообщение от SVG
Mihon
Дайте плиз таблицы. А то я запарился не глядя думать, а в яндеске навскидку нашел только досовую таблицу. http://www-sbras.nsc.ru/win/mathpub/comp-t...tm/code_pag.htm |
|
08.08.2005, 17:34 | #11 |
Участник
|
Цитата:
Сообщение от SVG
Mihon
Дайте плиз таблицы. А то я запарился не глядя думать, а в яндеске навскидку нашел только досовую таблицу. |
|
08.08.2005, 17:36 | #12 |
Участник
|
С определенной долей вероятности можно сказать, что если большая часть Instr[i] + 64>255, то текст - windows-1251 .
|
|