Форум » [x]Harbour » [?] Hb_oemtoansi » Ответить

[?] Hb_oemtoansi

Dima: [pre2] REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) ? hb_ansitooem(hb_oemtoansi('■')) ? hb_ansitooem(hb_oemtoansi('Ж')) [/pre2] В первом случае я не получаю символ с десятичным кодом 254 , получаю не понятно что. Почему так ?

Ответов - 16

Andrey: Dima пишет: В первом случае я не получаю символ с десятичным кодом 254 , получаю не понятно что. Почему так ? А в какой кодировке исходник программы ?

Dima: Andrey пишет: А в какой кодировке исходник программы ? 866

Andrey: Dima пишет: 866 Значит что то в этих функциях как то по особенному сделано... Нужно лезть в исходники, разбираться.


Dima: Far Manager по ходу корректно отрабатывает в этой ситуации. Хотел было перевести базы и сырцы с 866 на 1251 с помощью hb_oemtoansi() но чую что поймаю кучу косяков.

Pasha: исходники hb_oemtoansi и hb_ansitooem ничего не скажут, поскольку это только оболочка для вызова соответствующих функций winapi. Простой тест: Function OA Local c1 := '' Local c2 := '' Local c3 := '' Local c4 := '' Local c5 := '' Local c6 := '' Local i Local cCr := Chr(13)+Chr(10) for i := 128 to 255 c1 += Chr(i) c2 += hb_oemtoansi(Chr(i)) c3 += hb_ansitooem(hb_oemtoansi(Chr(i))) c4 += if(Chr(i)==hb_ansitooem(hb_oemtoansi(Chr(i))),'+','-') c5 += hb_oemtoansi(hb_ansitooem(Chr(i))) c6 += if(Chr(i)==hb_oemtoansi(hb_ansitooem(Chr(i))),'+','-') next memowrit('result.txt', c1+cCR+c2+cCR+c3+cCR+c4+cCR+c5+cCR+c6+cCR) Return nil показывает, что для спецсимволов преобразования hb_oemtoansi(hb_ansitooem()) неэквивалентны. Речь идет о спецсимволах, вроде chr(254). В принципе ни исходники программы, ни БД не должны содержать таких спецсимволов. Но, тем не менее, они могут быть. В исходниках это, к примеру, псевдографика, в базах - двоичные поля. Двоичные поля вообще перекодировать не надо, а псевдографики в кодировке ansi нет как таковой. Могут быть еще другие случаи. Для них вместо hb_oemtoansi и hb_ansitooem можно использовать функцию hb_translate между кодировками RU866 и RU1251. Но эта функция будет глючить для специфических украинских символов, из-за особенности их представления в cp866. Хотя она должна отрабатывать примерно как Far.

Dima: Pasha пишет: ни БД не должны содержать таких спецсимволов Да есть любители вставлять в название контрагента кубики и прочее )) Pasha пишет: можно использовать функцию hb_translate между кодировками RU866 и RU1251 Попробую , спасибо ! Pasha пишет: Но эта функция будет глючить для специфических украинских символов укры и тут поднасрали

Dima: Попробовал , тоже глючит ? hb_translate(hb_translate('■',"CP866","CP1251"),"CP1251","CP866")

Pasha: Я использую пару функций: DosToWin и WinToDos, которые не трогают спецсимволы: https://cloud.mail.ru/public/1TzD/uZwMTr9ES

Dima: Pasha Не хватает функции IsCharacter

Pasha: Можно заменить на ValType(cVar) == "C"

Dima: Pasha ОК или на HB_ISSTRING

Dima: а сырец _dw.prg я так понимаю в кодировке 866 ?

Pasha: да

Dima: Спасибо Паш

Dima: Что то я тогда одну вещь не пойму. Есть сырец в кодировке 866 , база тоже в ней. Создаю объект Excel , и заполняю таблицу Excel данными из базы DBF , при этом не делая ни какой перекодировки. Данные в Excel отображаются корректно , включая и символ с кодом 254 , но ведь кодировка в Excel точно не 866 а 1251. В ранних версиях Harbour если не ошибаюсь нужно было перекодировать с помощью Hb_oemtoansi , в поздних уже нет. Не пойму каким волшебным образом символ с кодом 254 корректно показывается в Excel. Возможно существует некая функция по перекодировке а я про нее не знаю.

Pasha: Теперь уже "играет" уникодность харбора. Строка из cp866 преобразовывается в utf16, и в этой кодировке ее и получает Excel.



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