Форум » [x]Harbour » про кодировку » Ответить

про кодировку

alex_II: Помогите разобраться с кодировками В проекте использую dbf-файлы в кодировке 866, но потребовалось использовать один файл в кодировке 1251. Все нормально работает кроме случая, когда данные из файла с кодировкой 1251 запоминаю в переменные, а потом выдаю на экран. И получаю мусор. С данными в кодировке 866 все нормально В исходнике есть строки: REQUEST HB_LANG_RU866 REQUEST HB_LANG_RUWIN REQUEST HB_CODEPAGE_RU866 REQUEST HB_CODEPAGE_RU1251 ... HB_SetCodePage('RU1251')

Ответов - 24, стр: 1 2 All

Петр: alex_II пишет: данные из файла с кодировкой 1251 запоминаю в переменные, а потом выдаю на экран. И получаю мусор. Скорее всего не установлена TermCP hb_SetCodePage('RU1251') hb_SetTermCP( hb_cdpTerm() ) или hb_SetTermCP( 'RU866', 'RU1251' ) Не понятно в какой кодировке у вас исходники, используете ли вы CODEPAGE вместе с USE и зачем все приводить к 'RU1251', если большинство данных в 'RU866' (здесь могу ошибаться) Одним словом - недостаточно исходных данных, но поиграйтесь с hb_SetTermCP/hb_SetDispCP(), уверен, что поможет (опять же если программа консольная)

SergKis: тут есть http://clipper.borda.ru/?1-4-20-00001177-000-0-0-1489381836

alex_II: SergKis пишет: Не понятно в какой кодировке у вас исходники, используете ли вы CODEPAGE вместе с USE и зачем все приводить к 'RU1251', если большинство данных в 'RU866' (здесь могу ошибаться) Использую MimiGui, программа не консольнная Исходники в кодировке 866 Базы открываю так: USE &Path_Dbf.&tFile ALIAS tfl NEW CODEPAGE 'RU1251' EXCLUSIVE USE &newName ALIAS old NEW CODEPAGE 'RU866' EXCLUSIVE Использование кодировки 1251 обусловлено тем что в 866 не работает функция Crypt


Vlad04: Использование кодировки 1251 обусловлено тем что в 866 не работает функция Crypt Странно, под хХарбор- консоль базы шифровал (Правда, для пробы. В реалии не потребовалось)

Dima: Vlad04 пишет: консоль базы шифровал Под консолью (866) Harbour и у меня не было проблем. Использовал CharXor с обраткой. После как , одну задачу пришлось делать под Minigui + Harbour и базы в 866 с CharXor начались чудеса. Пробнул было заменить его на Crypt , не помогло.

SergKis: alex_II есть еще из rdd\hbsix HB_FUNC( SX_ENCRYPT ) HB_FUNC( SX_DECRYPT ) попробуйте

Pasha: Если таблица открыта в кодировке, отличающейся от заданной в программе, то при чтении из нее данные автоматически перекодируются в кодировку, заданную в программе, а при записи - обратно. Таким образом, считанные данные, которые передаются функции Crypt, отличаются от тех, которые хранятся в таблице в части кодов для диапазона русских символов. Перекодировка cp1 - > cp2 -> cp2 в общем случае неэквивалентна, т.е. hb_translate(hb_translate(cc, 'RU866, 'RU1251'), 'RU1251, 'RU866') # cc hb_translate(hb_translate(cc, 'RU1251, 'RU866'), 'RU866, 'RU1251') # cc При использовании crypt получаются непечатные символы, и поэтому в таком случае функция crypt работает неправильно, и вина совсем не ее. Точно так же будет неправильно работать любой симметричный крипто-алгоритм.

SergKis: SerKis пишет попробуйте имел ввиду для 866 базы

Pasha: Лучше шифровать таблицу встроенным методом rdd: dbInfo( DBI_ENCRYPT, cKey ) Чтобы затем работать с зашифрованной таблицей после открытия, надо будет задать пароль : dbInfo( DBI_PASSWORD, cKey )

Dima: Pasha А если шифровать только одно поле , как тогда , учитывая что база в 866 а прога GUI и сырцы в 1251 ?

SergKis: Если использовать для шифрованной базы rdd NSX [pre2] #command USE <(db)> [VIA <rdd>] [ALIAS <a>] [<nw: NEW>] ; [<ex: EXCLUSIVE>] [<sh: SHARED>] [<ro: READONLY>] ; [CODEPAGE <cp>] [INDEX <(index1)> [, <(indexN)>]] ; [TRIGGER <trig>] [PASSWORD <pass>] => ; [sx_SetTrigger( TRIGGER_PENDING, <trig>, <rdd> );] <-trig-> ; [sx_SetPass( <pass>, 1, <rdd> );] <-pass-> ; dbUseArea( <.nw.>, <rdd>, <(db)>, <(a)>, ; iif( <.sh.> .OR. <.ex.>, ! <.ex.>, NIL ), <.ro.> [, <cp>] ) ; [; dbSetIndex( <(index1)> )] ; [; dbSetIndex( <(indexN)> )] [/pre2] должно работать нормуль и для 866 и для 1251

Pasha: Dima пишет: А если шифровать только одно поле , как тогда , учитывая что база в 866 а прога GUI и сырцы в 1251 ? Тогда такой способ не подходит, так как шифруются все символьные поля. Придется открывать базу, не указывая кодировки, и ручками расшифровывать и перекодировать нужные поля.

SergKis: Pasha пишет Придется открывать базу, не указывая кодировки, и ручками расшифровывать и перекодировать нужные поля. А разве по умолчанию (без CODEPAGE) не устанавливается для базы кодировка от программы ?

Pasha: SergKis пишет: А разве по умолчанию (без CODEPAGE) не устанавливается для базы кодировка от программы ? Так и есть. При этом харбор просто читает данные из базы, не перекодируя их. Но если указать отличную от программы кодировку, криптофункции будут работать неправильно. Поэтому кодировку не надо указывать, и перекодировать данные для вывода на экран и печати вручную.

Pasha: Чтобы было понятнее, почему трансляция из одной кодовой страницы в другую и обратно не дает первоначального значения. Берем символ с кодом 192 и транслируем его из cp866 в cp1251. В cp866 это символ псевдографики, он не транслируется, поэтому результат так и остается - 192. Затем транслируем его обратно из cp1251 в cp866. А в cp1251 код 192 - это русская буква "А", и она транслируется в код 128 - "А" в cp866. Получаем: 192 --> (cp866-cp1251) 192 --> (cp1251-cp866) 128 192 не равно 128

Dima: Pasha Спасибо что прояснил. Вопрос а каким образом корректно перегнать сырцы из 866 в 1251 учитывая что в сырцах может быть псевдографика ? Думал простую прогу сделать которая в цикле обработает сырцы в папке и построчно сконвертит в 1251 с помощью Hb_oemtoansi , но чую будут косяки.

Pasha: У нас кажется уже был разговор на эту тему. Вопрос в том, что будет корректно для псевдографики и прочих непечатных символов, учитывая то, что в cp1251 ее нет как таковой и она там не нужна. Можно просто перекодировать весь текст с помощью того же far, и затем визуально пройтись по результату. У фара есть плагин visual compare, я его давно использую. Он выдает различия двух файлов, причем для каждого можно указать кодировку. Можно сравнить этим плагином исходный файл в cp866, и результирующий в cp1251. Различия будут как раз на такой "псевдографике". И в каждом случае принимать решение, что с ней делать.

Pasha: Кстати, вот способ перекодировки: Открыть файл в far, указать кодовую страницу OEM Затем: Ctrl+A Ctrl+X F8 Ctrl+V F2 Сомнительнльные символы фар покажет сам.

Dima: Pasha пишет: У нас кажется уже был разговор на эту тему. Да был. Печаль. Значит вот такие рамочки в 1251 уже и не сделать... http://shot.qip.ru/00TIHy-1oq4QIimw

sugar5050: Уважаемые гуру.Подскажите как получить украинскую "і" при вводе текста в поле. Использую следю команды REQUEST HB_CODEPAGE_UA866 REQUEST HB_CODEPAGE_UA1251 HB_CDPSELECT("UA866")

Pasha: Никак. В кодировке 866 нет украинской i. В 1251 есть.

sugar5050: Спасибо, очень жаль

Pasha: Вместо кодировок RU866/RU1251 можно использовать UA1125/UA1251 UA1125 - это измененная 866, украинский стандарт 1992 года. Там i есть, только коды для некоторых символов отличаются от стандартной кодировки 866. Сам же когда-то делал эти кодировки, подзабыл уже, давно это было.

santy: при старте REQUEST HB_LANG_UAKOI8 REQUEST HB_CODEPAGE_UAKOI8 REQUEST HB_LANG_UAWIN в основной процедуре HB_SetCodePage("UAKOI8") HB_LANGSELECT("UAKOI8")



полная версия страницы