Форум » [x]Harbour » Вывод на экран сообщений на русском в консоле » Ответить

Вывод на экран сообщений на русском в консоле

Andrey_IV: Консольная программа, а если точнее - утилита командной строки Выполняет кое-какие действия, по ходу работы выводит на экран сообщения на русском языке Исходный PRG-файл в кодировке WIN-1251 - так уж сложилось, менять кодировки не хочется, - там просто вывод сообщений на экран ч/з QOUT Т.к. кроме консольной программы, есть еще и GUI программа (MiniGUI), то обычно скачиваю очередной релиз "Harbour MiniGUI Extended" и использую Harbour из этого дистрибутива. Собираю утилитой HBMK2 До версии HMG 2.1.1 вывод сообщений на экран был таким: QOUT(hb_AnsiToOem("Ошибка - отсутствует файл: ") + cFileName) После установки HMG 2.1.1 получил "крякозябриков", убрал hb_AnsiToOem(), все стало нормально вплоть до установки версии HMG 2.2.0 (на HMG 2.1.9 - все нормально) Попробовал снова использовать hb_AnsiToOem() - снова все сообщения нормально читаются Как я понимаю - HMG здесь не причем - это Harbour Или все-таки утилита HBMK2 ? В ней столько новых опций появилось Подскажите, что можно сделать чтобы и оставить исходный файл в кодировке WIN-1251 и более не заморачиваться с функциями hb_AnsiToOem()

Ответов - 8

AlexMyr: Andrey_IV пишет: Или все-таки утилита HBMK2 ? В ней столько новых опций появилось Она тут ни причем. Andrey_IV пишет: Подскажите, что можно сделать чтобы и оставить исходный файл в кодировке WIN-1251 и более не заморачиваться с функциями hb_AnsiToOem() [pre2] REQUEST HB_CODEPAGE_UA1251 func main() hb_cdpSelect("UA1251") if !hb_FileExists("ququ.txt") ?"Файл не знайдено" endif return [/pre2]

Andrey_IV: AlexMyr пишет: REQUEST HB_CODEPAGE_UA1251 func main() hb_cdpSelect("UA1251") if !hb_FileExists("ququ.txt") ?"Файл не знайдено" endif return У меня сейчас в программе так: REQUEST HB_CODEPAGE_RU1251 REQUEST HB_LANG_RUWIN FUNCTION Main( ... ) LOCAL cFileName := "ququ.txt" hb_SetCodepage("RU1251") hb_LangSelect("RUWIN") IF !FILE(cFileName) QOUT(Ошибка - отсутствует файл: " + cFileName) ENDIF RETURN На Harbour, что шел с дистрибутивами HMG 2.1.8 и HMG 2.1.9 - все нормально выводится - проверял сегодня А вот после установки HMG 2.2.0 вместо русского получаю "крякозябры" Использование функции hb_AnsiToOem() все исправляет Так что дело все-таки в Harbour новой сборки (наверное). Собственно исправить код исходника проблемы никакой нет. Но интересно: это уже насовсем так Harbour работать будет ? Или снова какой подвох ждать ? Ведь именно так Harbour выводил текст в кодировке WIN-1251 до мая прошлого года. Потом поведение изменилось. Теперь снова возврат к старому ?

Pasha: Andrey_IV пишет: hb_SetCodepage("RU1251") Это точно Harbour ? Эта функция давно переименована в hb_cdpSelect


Andrey_IV: Pasha пишет: Это точно Harbour ? Эта функция давно переименована в hb_cdpSelect Harbour MiniGUI Extended Edition 2.1.9 - 2013.01.22 Harbour Version: 3.2.0dev Built on: 2013-01-21 Last ChangeLog entry: 2013-01-21 16:36 UTC+0100 Przemyslaw Czerpak Changelog version: 18767 далее - см. Файл C:\MiniGUI\Harbour\Include\hbcompat.ch #ifdef __XHARBOUR__ #xtranslate hb_cdpSelect( [<x,...>] ) => hb_SetCodepage( <x> ) #else #xtranslate hb_SetCodepage( [<x,...>] ) => hb_cdpSelect( <x> ) #endif строка #include hbcompat.ch у меня в исходник включена, и по версию HMG 2.1.9 все отрабатывалось нормально по крайней мере - никаких ошибок при компиляции не было Возможно, что в Harbour с HMG 2.2.0 что-то поменялось, но ошибок тоже не было Буду разбираться... Всем спасибо!

Pasha: Andrey_IV пишет: Возможно, что в Harbour с HMG 2.2.0 что-то поменялось, но ошибок тоже не было Буду разбираться... Может быть, это не уникодная сборка ? Для уникодной достаточно указать кодовую страницу, а для неуникодной в консольной утилите надо специально вызывать hb_AnsiToOem() для правильного вывода на экран.

AlexMyr: Andrey_IV пишет: Использование функции hb_AnsiToOem() все исправляет вдогонку, после следующего релиза (когда будет не знаю) HB_OEMTOANSI()/HB_ANSITOOEM() уберут из harbour, Viktor добавил в библиотеку hbwin след. ф-ии WIN_OEMTOANSI() and WIN_ANSITOOEM().

vvv: А в чем смысл таких переименований?

Pasha: vvv пишет: А в чем смысл таких переименований? Поскольку эти функции переносятся в библиотеку hbwin, они должны соответствовать ее пространству имен. Виктор все делает по правилам.



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