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

CODEPAGE

spair2k: Хочу переходить с xHarbour на Harbour из последних сборок, но столкнулся с тем, что некоторый код не могу перевести, поскольку не пойму, как подключить кириллическую кодовую страницу. Конструкция: [pre2] REQUEST HB_CODEPAGE_RU866 hb_setCodePage('RU866')[/pre2] не работает... подскажите пожалуйста...

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

Петр: используйте hb_cdpSelect() или Set( _SET_CODEPAGE )

spair2k: Петр пишет: используйте hb_cdpSelect() или Set( _SET_CODEPAGE ) а у меня ругается при вызове этой функции... :( Пишет Unresolved external ...

Dima: spair2k Вероятно нужно прилинковать Hbextern.lib


Andrey: spair2k пишет: Хочу переходить с xHarbour на Harbour из последних сборок Я тоже собрался это делать. У меня программа на xHarbour'e GTWVT-терминал 866-кодировка. Подскажите какие нюансы нужно учитывать при переходе ? Как правильно в начале программы задать 866 кодировку ?

AlexMyr: hb_cdpSelect("RU866") если будет ругаться, то вначале добавить #include "hbextcdp.ch" а правильно так: IF Empty( cTermCP ) cTermCP := "PLISO" ELSE cTermCP := Upper( cTermCP ) ENDIF IF Empty( cHostCP ) cHostCP := "PLMAZ" ELSE cHostCP := Upper( cHostCP ) ENDIF lBoxChar := !Empty( lBoxChar ) hb_cdpSelect( cHostCP ) hb_SetTermCP( cTermCP, cHostCP, lBoxChar ) смотреть \harbour\tests\gtkeys.prg и читать Changelog 2006-02-04 17:05 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) ... The new three .prg functions: HB_SETKEYCP( <cTermCP> [,<cHostCP>] ) HB_SETDISPCP( <cTermCP> [,<cHostCP>] [,<lBoxChar>] ) HB_SETTERMCP( <cTermCP> [,<cHostCP>] [,<lBoxChar>] ) ... <cTermCP> is encoding used on external (terminal) side <cHostCP> is encoding used internally, if not given then current code page set HB_SETCODEPAGE() is used. some of GTs which uses unicode output may ignore <cTermCP> <lBoxChar> is optional parameter which interacts with dispbox() output disabling switching to alternate character set in some GTs. It effectively causes that if internal (host) code page contains some letters on the box char positions then they will be shown also by box drawing functions like dispbox() instead of CP437 characters. In some cases it could be useful. By default lBoxChar is not set and GTs which can switch between standard and alternate character set (GTCRS, GTSLN) will try to use alternate character set for box drawing functions.

Andrey: AlexMyr ПАСИБО БОЛЬШОЕ ! А еще вопрос не в тему: как сделать компиляцию одного prg файла с командной строки, чтобы привязать к вызову из FAR ? У меня для хХарбора есть вызов z:\xHarbour\bin\bld_b32.bat ! Как сделать аналогично для Харбора ?

AlexMyr: Для Dos navogator вызов по расширению prg{ c:\dev\harbour\bin\hbmk2.exe -p #.prg >#.log} для Far наверное z:\Harbour\bin\hbmk2.exe !

Andrey: AlexMyr пишет: для Far наверное z:\Harbour\bin\hbmk2.exe ! Нет, вот так работает для Far: z:\hb30\Bin\HBMK2.EXE -gtwin !.! > !.log -run -gtwin : терминал GTWIN -run : запуск сразу программы А вообще классная штука HBMK2.EXE

Vlad04: spair2k и Andrey Хочу переходить с xHarbour на Harbour А какие Вы хотите получить преимущества от такого перехода. Понятно, если бы на GUI.

AlexMyr: Vlad04 пишет: Понятно, если бы на GUI. А тут в чем преимущество, в красивых рюшечках?

Andrey: Vlad04 пишет: А какие Вы хотите получить преимущества от такого перехода. 1) Харбор быстрей хХарбора, здесь на форуме тесты приводились. 2) Возможность использовать MinGW и собирать приложения х64. 3) Терминал GTWVT на Харборе поддерживает создание дочерних окон программы. ?:\hb30\tests\wvtext.prg

serj: Привет всем ! Может мой вопрос и повторяется но все же задам. dbf файл создан в dos, что нужно чтобы при редактировании базы данные сохранялись и отображались (ТSBROWSE) в кодировке 866 использую версию Harbour MiniGUI Extended Edition 2.1.5 - 2012.09.12

PSP: REQUEST HB_CODEPAGE_RU866 HB_CDPSelect( "RU866" )

serj: Все равно не отображается dos база в код.866 в TSBROWSE, если корректируешь то данные сохраняются в RU1251.

Pasha: При старте программы надо задать: REQUEST HB_CODEPAGE_RU866 REQUEST HB_CODEPAGE_RU1251 HB_CDPSelect( "RU1251" ) при открытии файла надо указывать 866-ю страницу: USE ... CODEPAGE "RU866"

serj: Спасибо ! Все работает.

Andrey: Опять фигня с кодировками... xHarbour 1.2.3 Intl. (SimpLex) (Build 20130903) Терминал GTWVT, в программе стоит: REQUEST HB_CODEPAGE_RU866 hb_SetCodepage( "RU866" ) REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") hb_cdpSelect("RU866") Wvt_SetCodePage(255) // #define OEM_CHARSET 255 - from wingdi.h Wvt_SetFont( 'Terminal', 18, 10, 0 ) Считываю файлы с директории на русском языке: Импорт из системы ГОРОД.doc Конфигурация программы.doc В программе считываются как: ╚ьяюёє шч ёшёєхь√ ├╬╨╬─.doc ╩юэїшуєёрўш  яёюуёрьь√.doc Вывожу на экран преобразовав функцией HB_ANSITOOEM(). Получается фигня: Импосу из сисуемы ГОРОД.doc Конхигусачия псогсаммы.doc Что не так делаю ?

Dima: Andrey пишет: Импосу из сисуемы ГОРОД.doc Конхигусачия псогсаммы.doc Это на хорватском ? В какой кодировке содержимое файлов которые считываешь ?

Andrey: Перед тем как считать файлы проверяю ? hb_SetCodepage() , возвращает "RU866" Имена файлов в папке только на русском...

Dima: сделал вот такой простой тест на Harbour 3.2 [pre2] proc main local amas REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) amas:=directory("*.doc") aeval(amas,{|x| qout(x[1])}) return [/pre2] Имена вывалились нормально на русском .

santy: Dima пишет: proc main local amas REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) amas:=directory("*.doc") aeval(amas,{|x| qout(x[1])}) return данный код корректно отработал в xHarbour на файлах с кирилицей в названии.

Andrey: Dima пишет: Имена вывалились нормально на русском . Да точно, этот короткий тест тоже у меня отработал НОРМАЛЬНО ! Полез в свою функцию сортировки получения массива... Вот через неё не срабатывало (а может и еще что-то мешает...) : #include "Directry.ch" ************************************************ FUNCTION MyFileDirectory(cPath,cPicture, nSort ) LOCAL aDirectory := {}, nItem := 0, nI, aFiles := {}, aFileList := {}, cTemp DEFAULT nSort TO 1 // 1-сортировка по имени файла, 5-дата файла+имя файла IF nSort < 1 .AND. nSort > 5 Message( "Не правильный параметр сортировки = "+ALLTRIM(STR(nSort)), 5 ) RETURN {} ENDIF // Запись в aFileList информации из выбранного каталога aDirectory := DIRECTORY( cPath+cPicture ) IF LEN(aDirectory) > 0 FOR nItem := 1 TO LEN( aDirectory ) cTemp := DTOS( aDirectory[ nItem, F_DATE ] ) + LOWER(aDirectory[ nItem, F_NAME ]) AADD( aFileList, { LOWER(aDirectory[ nItem, F_NAME ] ), ; aDirectory[ nItem, F_SIZE ] , ; DTOS( aDirectory[ nItem, F_DATE ] ), ; aDirectory[ nItem, F_TIME ] , ; cTemp , ; } ) NEXT ASORT(aFileList,,, { |x, y| x[nSort] < y[nSort] }) // Сортировка имен файлов FOR nI := 1 TO LEN(aFileList) AADD(aFiles, aFileList[nI,1] ) NEXT ELSE Message( "Нет файлов в "+cPath+cPicture+" ...", 5 ) ENDIF RETURN( aFiles )

Pasha: Для того, чтобы имена файлов были в кодировке OEM, надо сделать функцию: #pragma BEGINDUMP #include "windows.h" HB_FUNC_STATIC( SETFILEAPIS ) // Имена файлов в кодировке OEM { SetFileApisToOEM(); } #pragma ENDDUMP и вызвать ее при старте программы: SETFILEAPIS() Тогда перекодировать ничего не надо.

evgeny2006: spair2k пишет: ...как подключить кириллическую кодовую страницу Большинство вопросов касается БД, что естественно. А у меня следующий вопрос. Если я собираю программу через hmg_IDE, то все нормально. Русский текст на форме отображается правильно Когда же я пытаюсь собрать программу с помощью .bat файла (приводится ниже), то получаю кракозябры: call C:\MiniGUI\batch\compile.bat demo %1 %2 %3 %4 %5 %6 %7 %8 %9 Как мне победить?

azoo: Имеется структурированный текстовый файл в 1251-кодировке. База данных в 866 кодировке. Возможно ли командой append from считать этот файл в базу чтобы была 866 кодировка? В append from есть параметр CODEPAGE, но как его использовать ?

alkresin: По идее ( я не проверял сам ) надо открыть ваш целевой dbf, указав кодировку 866, а в append from указать кодировку источника - в данном случае 1251.

azoo: alkresin, попробовал так: use sds codepage "RU866" zap appe from sds32.txt codepage ("RU1251") delimited with ( {"", "="} ) переносит в кодировке как в текстовом файле

alkresin: Хм... Думаю, это неправильно - какая-то ошибка в Харборе.. Во всяком случае, вот так работает: hb_cdpSelect( "RU866" ) use sds zap appe from sds32.txt codepage ("RU1251") delimited with ( {"", "="} )

azoo: alkresin пишет: Во всяком случае, вот так работает: hb_cdpSelect( "RU866" ) use sds zap appe from sds32.txt codepage ("RU1251") delimited with ( {"", "="} ) Ничего не получается и так :( Может как то можно через промежуточный файл преобразовать, какие-нибудь другие варианты?

Pasha: Если харбор собран с HB_CLP_STRICT, то append from ... codepage ... delimited with не сработает.

Pasha: Можно сделать так: use... hb_cdpSelect( "RU1251" ) append from ... hb_cdpSelect( "RU866" )

alkresin: azoo пишет: Ничего не получается и так :( А request HB_CODEPAGE_RU1251 у вас объявлен ? Может как то можно через промежуточный файл преобразовать, какие-нибудь другие варианты? Ну, самый очевидный вариант: s := Memoread( "sds32.txt" ) hb_MemoWrit( "sds32.txt", hb_Translate( s, "RU1251", "RU866" ) )

azoo: Спасибо за ответы, получилось. Правильный вариант: REQUEST HB_CODEPAGE_RU866 REQUEST HB_CODEPAGE_RU1251 hb_cdpSelect( "RU866" ) use sds zap appe from sds32.txt codepage ("RU1251") delimited with ( {"", "="} )

Andrey: Pasha пишет: при открытии файла надо указывать 866-ю страницу: USE ... CODEPAGE "RU866" А если создаешь базу и записать нужно в базу "RU866", а программа сама в кодировке RU1251 как делать ? Т.е. я делаю: DbCreate( cPathLocal+cFile, aStruct, "DBFCDX", .T., "MYALIAS" ) и копирую записи из другой базы (RU866) в MYALIAS ! Записи получаются в кодировке RU1251... А нужны в кодировке RU866. Как назначить кодировку RU866 при создании базы ?

Dima: Если верить коментам в сырце dbCreate( cFile, aStruct, cRDD, lKeepOpen, cAlias, cDelimArg, cCodePage, nConnection )

SergKis: Andrey пишет:Как назначить кодировку RU866 при создании базы ? 1. Harbour.. src\*.* 2. Far Alt+F7 *.prg,*.c наити dbcreate 3. получаем (dbcmd.c): [pre2] /* * In Clipper the arguments are: * dbCreate( cFile, aStruct, cRDD, lKeepOpen, cAlias, cDelimArg ) * In Harbour: * dbCreate( cFile, aStruct, cRDD, lKeepOpen, cAlias, cDelimArg, cCodePage, nConnection ) (HB_EXTENSION) */ HB_FUNC( DBCREATE ) [/pre2]

Andrey: Спасибо !!! Еще вопрос по ходу - что за параметр cDelimArg ?

Dima: Andrey пишет: Еще вопрос по ходу - что за параметр cDelimArg ? [pre2] /* * NOTE: 4-th, 5-th and 6-th parameters are undocumented Clipper ones * 4-th is boolean flag indicating if file should stay open (any boolean * value will enable this behavior) * 5-th is alias - if not given then WA is open without alias * 6-th is optional DELIMITED value used by some RDDs like DELIM */ [/pre2]

Andrey: Dima пишет: 6-th is optional DELIMITED value used by some RDDs like DELIM Я им не пользовался и не сталкивался...

Dima: Andrey пишет: Я им не пользовался и не сталкивался... Ну типа так [pre2] request DELIM dbcreate("test",{{"t","n",10,0},{"t1","n",10,0}} , "DELIM", .t., "tst", ";") tst->(dbappend()) tst->t:=10 tst->t1:=20 close tst [/pre2] На выходе получим TEST.TXT Вот только результат в нем такой 10,20 вместо ожидаемого 10;20

Andrey: Dima пишет: На выходе получим TEST.TXT Вспомнил, примеры в Клипере 5.3 были такие...

Oskar_AAA: С наступающим Новым Годом! Здоровья и всех благ... Программа на xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6476) Требуется обработать файлы, имена которых в кириллице, функция FILE() возвращает .F., работает ли FILE() с кириллицей в имени файла? Переименовать файлы нет возможности.... Пробовал функцией SETFILEAPIS() - имена на экран вышли в кириллице... Что делать дальше???

Oskar_AAA: Спасибо, доработал блок формирования имени файла, FILE() возвращает .T. с кириллицей в имени файла...

alkresin: И вас с наступающим! Не знаю, как в xHarbour, а в Harbour File() правильно отрабатывает, если REQUEST HB_CODEPAGE_..., hb_setCodePage(...) указывают на ту кодовую страницу, в которой написана программа. Попробуйте разные варианты, включая изменение кодовой страницы текста программы.

Oskar_AAA: Добрый день, EXCEL2010 открывает файл, имя которого содержит кириллицу и пробелы, а EXCEL2016 падает Excel.Application:WORKBOOKS/14 DISP_E_BADPARAMCOUNT: OPEN открываю с помощью WorkBooks:Open() Решил проблему по схеме: - копирую файл с кириллицей и пробелами в имени в рабочий каталог с фиксированным именем (например TEMP_EXCEL) - открываю Excel (2010/2016) TEMP_EXCEL - обработка - удаление TEMP_EXCEL

Haz: Oskar_AAA пишет: DISP_E_BADPARAMCOUNT Скорее что-то не так в пути к файлу раз простое копирование решает проблему. Тоже открываю кириллицу и пробелы экселями 07—16 и все нормально.

Pasha: Для неуникодных программ (а xharbour именно такой) существенной является кодировка, в которой представлено имя файла. Если сделан вызов SetFileApis (которая вызывает SetFileApisToOEM()), то windows работает с именами в кодировке OEM, т.е. cp866. Для excel же надо обязательно передавать имя документа в кодировке cp1251. Хотя все равно непонятно различное поведение разных версий excel.

Oskar_AAA: С наступающим Новым Годом, друзья. Вот и я хочу понять "Кто is Who?" Excel2010 без проблем открывает, а 2016 выносит мозги... Пока оставил по схеме см.пост выше, но интерес остался, для кругозора...

Oskar_AAA: + файл источник копируется в файл TEMP_EXCEL.xls в том же каталоге, что файл источник.... Так, что в пути к файлу ничего не меняется... фрагмент кода: Lsmet_File3=Mar5+Alltrim(Name_Lsmet3)+'.XLS' ?Lsmet_File3,File(Lsmet_File3) wait If File(Lsmet_File3)==.T. cFileXls_Exl:=Mar5+'BALABA.XLS' Copy File &Lsmet_File3 To &cFileXls_Exl oExcel_S :=ToleAuto():New("Excel.Application") oExcel_S :Workbooks:Open(cFileXls_Exl) oExcel_S :Set("DisplayAlerts",.F.) oExcel_S :Visible :=.F. oBook_S :=oExcel_S:ActiveWorkBook oAs_S :=oExcel_S:ActiveSheet() oRange_S :=oExcel_S:ActiveCell:SpecialCells(xlLastCell) cRecno_S :=oRange_S:Row cColumn_S :=oRange_S:Column ......



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