AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.08.2005, 11:19   #1  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Вопрос больше алгоритмический.

Есть у меня входной текстовой файл, который мне нужно подгружать в БД. Допустим с кучей кратких однострочных описаний товара.

Но есть проблема (эх, не люблю я это слово, пусть лучше будет "задача"). Строки описаний могут быть в разных кодировках - либо DOS(866) либо WIN(1251). Не спрашивайте почему так получилось.

Задача состоит в автоматическом определении кодировки. Не подкинете идей?
Старый 08.08.2005, 11:35   #2  
SVG is offline
SVG
Участник
 
201 / 10 (1) +
Регистрация: 15.11.2004
Как-то видел способ, основанный на подсчете русской буквы "о" в тексте. Типа если символов 174 - это DOS, если символов 238 - WIN

Не знаю как сильно тебе это поможет (это для текста хорошо, а для данных - ХЗ - там поди числа сплошные)
Рассмотреть так же вариант изменения выгрузки - в имя файла добавить префикс, в начало файла добавить маркер и т.п.
Старый 08.08.2005, 11:43   #3  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
"Немного подумал" © и придумал.

Во-первых, преобразуем считанную строку в UpperCase.
Во-вторых, пишем в фаре алфавит в кодировке WIN и переводим его в DOS. Все символы кроме "Ё" получились с кодом большим 179. Символ "Ё" преобразовался в "и".

Отсюда простой вывод: т.к. описание товара не может состоять из одного символа, то достаточно проверить строку на вхождение символа с кодом >179. Если такой символ находится, значит это DOS-строка. Иначе WIN.

Если кому интересно, чуть попозже закину код
Старый 08.08.2005, 14:00   #4  
Mihon is offline
Mihon
Участник
 
39 / 10 (1) +
Регистрация: 25.03.2005
Мысль несколько запутанная... Но в чем-то верная.

В кодировке 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  
Mihon is offline
Mihon
Участник
 
39 / 10 (1) +
Регистрация: 25.03.2005
Цитата:
Сообщение от tyrex
"Немного подумал" © и придумал.

Во-первых, преобразуем считанную строку в UpperCase.
Во-вторых,  пишем в фаре алфавит в кодировке WIN и переводим его в DOS. Все символы кроме "Ё" получились с кодом большим 179. Символ "Ё" преобразовался в "и".

Отсюда простой вывод: т.к. описание товара не может состоять из одного символа, то достаточно проверить строку на вхождение символа с кодом >179. Если такой символ находится, значит это DOS-строка. Иначе WIN.

Если кому интересно, чуть попозже закину код
Странный символ 179. Ё у меня, вообще-то видится как 168. Промахнулись на десяток? Данный вариант работает, только если в ДОСОВСКОМ тексте не окажутся одни заглавные буквы и маленькие "абвгдежзи" (если до 168) или "фбвгдежзиклмноп" если до (179).
Старый 08.08.2005, 15:34   #6  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
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  
SVG is offline
SVG
Участник
 
201 / 10 (1) +
Регистрация: 15.11.2004
А если у нас там запятая, тире, точка, цифра, etc?

По этому куску кода если хоть ОДИН символ лежит в диапазоне 176..223 - строка считается DOS - зачем там сделан цикл?
Старый 08.08.2005, 16:13   #8  
Mihon is offline
Mihon
Участник
 
39 / 10 (1) +
Регистрация: 25.03.2005
Цитата:
Сообщение от 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>
Опять проблемы с математикой В тексте 179, в сырцах - 176... А на самом деле виндовые большие буквы начинаются, как я уже писал выше, с 0xC0h, т.е. со 192. К тому, же опущен сам апкейс. И перепутаны True и False, исходя из названия функции.

Цитата:
Сообщение от SVG
А если у нас там запятая, тире, точка, цифра, etc?
В таком случае функция продолжит работать до конца строки. Всё ОК. Но если автор оставит-таки своё 176 (179), то она будет заканчивать работу, натыкаясь на всякие спецсимволы виндовой кодировки, такие как парные кавычки и апострофы.

NB. по-умолчанию (если нет русских букв) строка будет считаться ДОСовской (если True с False, разумеется, местами поменять)
Старый 08.08.2005, 17:04   #9  
SVG is offline
SVG
Участник
 
201 / 10 (1) +
Регистрация: 15.11.2004
Mihon
Дайте плиз таблицы. А то я запарился не глядя думать, а в яндеске навскидку нашел только досовую таблицу.
Старый 08.08.2005, 17:25   #10  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Цитата:
Сообщение от SVG
Mihon
Дайте плиз таблицы. А то я запарился не глядя думать, а в яндеске навскидку нашел только досовую таблицу.
Ловите
http://www-sbras.nsc.ru/win/mathpub/comp-t...tm/code_pag.htm
Старый 08.08.2005, 17:34   #11  
Mihon is offline
Mihon
Участник
 
39 / 10 (1) +
Регистрация: 25.03.2005
Цитата:
Сообщение от SVG
Mihon
Дайте плиз таблицы. А то я запарился не глядя думать, а в яндеске навскидку нашел только досовую таблицу.
У меня ФАР с плагином Symbol Table. В редакторе показывает в зависимости от выбраной кодировки
Старый 08.08.2005, 17:36   #12  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
С определенной долей вероятности можно сказать, что если большая часть Instr[i] + 64>255, то текст - windows-1251 .
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:32.