Форум » GUI » Кодировка OEM в таблицах » Ответить

Кодировка OEM в таблицах

Vlad04: Похоже MINIGUI по умолчанию заточен на кодировку ANSI при работе с базами?Просто настроить на работу с таблицами в кодировке OEM не получится? Надо везде применять конвертацию hb_OemToAnsi ? Или есть другое решение ?

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

gfilatov2002: Vlad04 пишет: есть другое решение ? Да, есть Надо использовать команду USE ( имя базы ) ALIAS ( алиас ) CODEPAGE "RU866" // SHARED NEW предварительно объявив REQUEST HB_CODEPAGE_RU866 Конкретный пример применения есть в папке minigui\samples\Applications\DBFview

Vlad04: Не получается - ни в программе сделать , ни через DBFview открыть в нормальном виде. В DBFview на выбор в меню пункта Table -> Code Page появляется ListBox, в котором нет вариантов для выбора - <no codepage set>

Vlad04: При переходе в меню DBFview на русский язык - в ListBox появляется выбор страницы, но фактически изменение не происходит!


gfilatov2002: Vlad04 пишет: При переходе в меню DBFview на русский язык - в ListBox появляется выбор страницы Только что проверил пример DBFview - все работает нормально! По шагам: 1) откомпилировал DBFview с помощью батника compile.bat 2) открыл базу в OEM кодировке - вижу кракозябры 3) установил русский язык в программе 4) снова открыл предыдущую базу и нажал на кнопочной панели картинку с буквой "А" - Кодировка 5) выбрал в открывшемся окне пункт меню "Русский DOS (866)" и теперь вижу на экране нормальный русский текст в открытой базе

Vlad04: Я так и делал И еще много раз так же и шрифты менял - результат кракозябры Выложил файл (таблицу) http://www.fayloobmennik.net/1051820 Можете взглянуть, может у меня dbf какой-то неправильный - я его средствами хХарбор и создаю.

Vlad04: Вот форма , в которой собственно и пытаюсь открыть OEM таблицу 1) В КомбоБохе выбрать таблицу 2) В Чеке открыть http://www.fayloobmennik.net/1051975

gfilatov2002: Vlad04 пишет: И еще много раз так же и шрифты менял - результат кракозябры Разобрался: Вам надо было закрыть базу после русификации утилиты DBFview, а затем открыть ее снова (еще лучше просто закрыть программу и запустить ее повторно). Проверил на Вашей OEM-базе - все показывает нормально после установки DOS-кодировки

Vlad04: Да, после последних инструкций закрыть базу после русификации утилиты DBFview, а затем открыть ее снова все увидел НОРМАЛЬНО. Целое шаманство!. Спасибо А как с примером программы (http://www.fayloobmennik.net/1051975)? Там должна таблица сразу открываться в нужной кодировке.

Andrey: Что то не въеду я в перекодировку-открытие баз в МиниГуи.... Открываю базу (866), создаю свою базу в RU1251, переписываю поля из 866 (по условию) и пустая база на выходе, с количеством записей отобранных по условию, т.е. в числовых полях 0, а в текстовых ПУСТО. Вот примерный код... #include "minigui.ch" REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866 REQUEST DBFCDX, DBFFPT FUNCTION CopyNewDbf() ..... SET LANGUAGE TO RUSSIAN // язык SET CODEPAGE TO RUSSIAN // кодовая страница SET Date TO GERMAN RDDSETDEFAULT('DBFCDX') ....... // открытие базы-источника bErrHandler := ErrorBlock( { | VAR | BREAK( VAR ) } ) BEGIN SEQUENCE USE ( cFileDbf2 ) Alias MASTER NEW SHARED CODEPAGE( "RU866" ) RECOVER MsgStop( "БАЗА " + cFileDbf2 + " уже открыта !", "Ошибка !" ) RETURN END SEQUENCE ErrorBlock( bErrHandler ) // создание базы cFileDbf := M->cPath_Pass+M->cFile_Pass AADD( aDbf , {"KODFIRMA" ,"N", 5,0 } ) AADD( aDbf , {"FIRMA" ,"C", 25,0 } ) AADD( aDbf , {"KODFIO" ,"N", 5,0 } ) AADD( aDbf , {"FIO" ,"C", 25,0 } ) AADD( aDbf , {"PUSTO" ,"C", 10,0 } ) DBCreate( cFileDbf, aDbf ) USE ( cFileDbf ) Alias TEMP_PASS NEW EXCLUSIVE SELECT MASTER GOTO TOP DO WHILE !EOF() IF !DELETED() IF MASTER->KMASTER > 0 IF MASTER->KSITE == 1 SELECT TEMP_PASS APPEND BLANK FIELD->KODFIRMA := M->nFirmaKod FIELD->FIRMA := M->cFirmaName FIELD->KFIO := MASTER->KMASTER FIELD->FIO := MASTER->MASTER FIELD->PUSTO := MASTER->PASS ENDIF ENDIF ENDIF SELECT MASTER SKIP ENDDO CLOSE TEMP_PASS ..... Что не так делаю ? Уже пробовал: USE ( cFileDbf2 ) Alias MASTER CODEPAGE "RU866" NEW EXCLUSIVE DBCreate( cFileDbf, aDbf ) USE ( cFileDbf ) Alias TEMP_PASS CODEPAGE "RU1251" NEW EXCLUSIVE Все бестолку.... Вот результирующий файл - http://files.mail.ru/Y243DW Harbour MiniGUI Extended Edition 2.1.8 - 2012.12.12

a_sidorov: При чем здесь Minigui, у Вас просто операция присваивания символьной строки, которая никаких перекодировок не делает. Поставьте в операцию присваиванию функцию перекодировки.

Andrey: a_sidorov пишет: просто операция присваивания символьной строки, которая никаких перекодировок не делает. Поставьте в операцию присваиванию функцию перекодировки. Ставил, всё бестолку ! А цифровые поля почему тогда не переписывают ? Базу результата выложил специально ! Там все цифровые поля по нулям, а текстовые - пустышка. Что не так делаю ?

Pasha: Andrey пишет: SET CODEPAGE TO RUSSIAN // кодовая страница Эта команда эквивалентна вызову HB_SETCODEPAGE( "RU1251" ) Поскольку для результирующего файла кодовая страница не указана, то используется RU1251 Поскольку для исходного файла указана кодовая страница RU866, данные из него автоматически перекодируются в RU1251. Если результирующий файл тоже должен быть в RU866, при его открытии надо указать эту кодовую страницу. При записи в этот файл данные будут подвергнуты обратной конвертации: RU1251 ->RU866

Andrey: Pasha пишет: Поскольку для результирующего файла кодовая страница не указана, то используется RU1251 Да никакая кодовая страница не используется ! Пустая база создается ! SET LANGUAGE TO RUSSIAN // язык SET CODEPAGE TO RUSSIAN // кодовая страница Делал для МиниГуи - как Григорий рекомендовал ! Т.е. полная засада по БД в МиниГуи... А может это Harbour 3.2 виноват ? Вот сделал пример отдельный - http://files.mail.ru/FM6EIP Пишу в базу: FIELD->FIO := "Test write !" FIELD->PUSTO := REPLICATE("¤",10) Даже и не записывается... Пустые поля и все ! Что то нужно добавить... А что не знаю ?

Pasha: Тогда вопрос не в кодовой странице. Файл получается пустой, срабатывает только append. Попробуйте сделать промежуточный dbCommit(), и вывод на экран значений полей результирующего файла сразу после присваивания.

a_sidorov: Вместо FIELD->FIO:= нужно писать TEMP_PASS->FIO:=MASTER->MASTER, тогда все работает

Pasha: a_sidorov пишет: Вместо FIELD->FIO:= нужно писать TEMP_PASS->FIO:=MASTER->MASTER, тогда все работает Это такая фича minigui, что ли ? Он перекрывает стандартные обозначения ?

Dima: Andrey пишет: FIELD->FIO := "Test write !" Оригинально ;) FIELD это что у вас , алиас ?

Pasha: Dima пишет: Оригинально ;) FIELD это что у вас , алиас ? Не просто оригинально ;) Это таки фича hmg Код FIELD->KODFIRMA := M->nFirmaKod FIELD->FIRMA := M->cFirmaName FIELD->KFIO := MASTER->KMASTER FIELD->FIO := HB_OEMTOANSI(MASTER->MASTER) FIELD->PASSWORD := HB_OEMTOANSI(MASTER->PASS) FIELD->PUSTO := HB_OEMTOANSI(MASTER->PASS) Транслируется препроцессором в _HMG_SYSDATA[404] := "->KODFIRMA := M->nFirmaKod" _HMG_SYSDATA[404] := "->FIRMA := M->cFirmaName" _HMG_SYSDATA[404] := "->KFIO := MASTER->KMASTER" _HMG_SYSDATA[404] := "->FIO := HB_OEMTOANSI(MASTER->MASTER)" _HMG_SYSDATA[404] := "->PASSWORD := HB_OEMTOANSI(MASTER->PASS)" _HMG_SYSDATA[404] := "->PUSTO := HB_OEMTOANSI(MASTER->PASS)" Это неожиданное (мягко говоря) преобразование делает вот эта команда из i_altsysnax.ch: #xcommand FIELD <field>; =>; _HMG_ActiveControlField := <"field">

Dima: Pasha Необычно ;)

a_sidorov: Это не необычно, это труба. У меня Field-> на каждой строке, а была идея перевода программ на MINIGUI



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