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

CODEPAGE

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

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

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



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