Форум » Clipper » перекодирока dbf в 866 кодовую страницу » Ответить

перекодирока dbf в 866 кодовую страницу

SergeyKorotun: В dbf базе украинский текст набран с помощью утилиты keyrus. Какая это кодовая страница - не знаю. Если данные из этой базы перенести в другую dbf базу, которая использует 866 кодовую страницу, то в новой базе эти данные не читабельны. Как средствами clipper5 преобразовать данные в 866 кодовую страницу, а если это невозможно, то какой сторонней утилитой можно сделать данное преобразование?

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

SADSTAR33: В утилите DBFnavigator есть пункт меню "Сменить кодировку" (DOS<->Win) потом сохранить файл.

SergeyKorotun: При смене кодировки DBFnavigatorom остается несколько символов (например "щ" перекодируется "ц"), все остальные символы перекодируются в "_" Исходная база заполняется программой, написанной на Фокспро 2.6а и символьные данные заносятся на украинском языке с помощью утилиты keyrus. Данные из этой базы нужно перенести в базу, созданную в визуал фокспро 7, но не полностью, а изменив в последней некоторые записи. Скорее всего нужно перекодировать из ДОС в ДОС

a_sidorov: Пока ищете утилиту, напишете свою перекодировку. Нужно только составить таблицу соответствия, привожу пример перекодировки для WIN1251-> 866. По любому нужно менять код на код. Я бы не доверился утилитам. Или просто две кодовые страницы забить (найти и скопировать в программу), потом искать замену каждого символа по таблицам. Нашел сходу кодировки украинского http://porokhnyak.org/cyr/index.ru.html, посмотрите кодировку в Вашем файле dbf, по любому нужно знать исходную кодировку и кодовую страницу. FUNC w_d(c) // && WIN1251->Dos Local b:="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя─┌┘┴┬└┐┼│├┤═╔╝╩╦╚╗╬║╠╣№ёЁ" Local a:="└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙•√№¤■ -+++++++|||=+++++++|||╣╕и" Local i local ret i=At(c,a) if i>0 ret:=substr(b,i,1) else ret:=c endif RETURN ret


Pasha: SergeyKorotun пишет: Скорее всего нужно перекодировать из ДОС в ДОС Есть 2 украинские кодировки: ms (866) и украинский ГОСТ 1992-го года (1125). Они отличаются только несколькими украинскими символами. Перекодировка между ними: Function UkrToMs(c) // ------------------------------------------------------------- // Перекодировка УкраинаГОСТ cp1125 -> cp866 // ------------------------------------------------------------- Return CharRepl(Chr(242)+Chr(243)+Chr(244)+Chr(245)+Chr(246)+Chr(247)+Chr(248)+Chr(249), c, Chr(131)+Chr(163)+Chr(242)+Chr(243)+Chr(73)+Chr(105)+Chr(244)+Chr(245), .t.) Function MsToUkr(c) // ------------------------------------------------------------- // Перекодировка cp866 -> УкраинаГОСТ cp1125 // ------------------------------------------------------------- Return CharRepl(Chr(242)+Chr(243)+Chr(244)+Chr(245), c, Chr(244)+Chr(245), .t.)

SergeyKorotun: a_sidorov пишет: Return CharRepl(Chr(242)+Chr(243)+Chr(244)+Chr(245), c, Chr(244)+Chr(245), .t.) А где взять функцию CharRepl()? Я использую клиппер5

Pasha: Это функция из clipper tools

SergeyKorotun: Скачал clipper tools 3 Будет работать с clipper 5.01 и если да, то как подцепить? Использую оболочку clip.exe Батником ни одного раза не компилировал.

petr707: Лучше взять родной комплект Clipper Tools II/5.0, или напишите свой аналог, что-то типа Function CharRepl2(cSearchFor, cText, cReplace) Local lSearchFor:=len(cSearchFor), lReplace := len(cReplace) Local i,s1,s2 lSearchFor:=min(lSearchFor,lReplace ) for i=1 to lSearchFor s1:=substr(cSearchFor,i,1) s2:=substr(cReplace ,i,1) cText:=STRTRAN(cText,s1,s2) next i return cText

Andrey: Pasha пишет: Есть 2 украинские кодировки: ms (866) и украинский ГОСТ 1992-го года (1125). Они отличаются только несколькими украинскими символами. Не совсем понятно ? В Харборе есть 3 кодировки: Ukrainian Windows-1251 HB_CODEPAGE_UA1251 "UA1251" cpuawin.c Ukrainian 866 HB_CODEPAGE_UA866 "UA866" cpua866.c Ukrainian KOI-8U HB_CODEPAGE_UAKOI8 "UAKOI8" cpuakoi.c 1125 - то же самое что и "UA1251" ?

Pasha: Andrey пишет: В Харборе есть 3 кодировки: Неверно. В харборе есть 4 украинские кодировки: 866, 1125, 1251 и koi8u 1125 почти совпадает с 866-й, кроме кодов для специфических украинских символов. Это кодировка была принята в 1991 году Минэкономики еще УССР в качестве республиканского стандарта. Свое название - cp1125, или как ее еще называют, ruscii, она получила позднее. Поскольку тогда с кириллическими кодировками творился бардак, она отличается от 866-й, которая де-факто к 91-му году уже существовала, но microsoft ее утвердила позже. А 1251 - это кириллическая кодировка для windows, которая появилась еще позже, в ней коды символов кириллицы отличаются от 866-й

Andrey: Pasha пишет: В харборе есть 4 украинские кодировки: 866, 1125, 1251 и koi8u Спасибо ! Буду знать теперь. А как идет вызов кодировки 1125 для БД ? CODEPAGE "UA866" CODEPAGE "UA1251" CODEPAGE "UAKOI8" CODEPAGE "?????" И нужно ли в Харборе и МиниГуи описывать все используемые кодировки ? REQUEST HB_CODEPAGE_UA866 REQUEST HB_CODEPAGE_UA1251 и т.д.

Pasha: Andrey пишет: CODEPAGE "?????" Кодировка называется UA1125. Стало быть: HB_SETCODEPAGE('UA1125') или hb_cdpSelect('UA1125') SET CODEPAGE TO .. это как я понимаю команда minigui, и в ней есть далеко не полный список возможных кодировок. Если нужной кодировки нет, ее надо задать стандартными средствами харбора. В конце концов, это одно и то же, и применять эту команду hmg совершенно необязательно. А описывать естественно надо используемые кодировки, а неиспользуемые - не описывать. Так советует капитан очевидность.

Andrey: Pasha пишет: А описывать естественно надо используемые кодировки, а неиспользуемые - не описывать. Так советует капитан очевидность. Спасибо !

Andrey: SergeyKorotun пишет: то какой сторонней утилитой можно сделать данное преобразование? Вот этой утилитой... Русский работает, остальные проверять надо... Правда еще не доделал до конца эту прогу, но все равно её нужно тестировать... http://files.mail.ru/349DE519487D43279426E1FF862868BF

SergeyKorotun: Всем спасибо за помощь. Использовал функцию: Pasha пишет: Function UkrToMs(c) // ------------------------------------------------------------- // Перекодировка УкраинаГОСТ cp1125 -> cp866 // ------------------------------------------------------------- Return CharRepl(Chr(242)+Chr(243)+Chr(244)+Chr(245)+Chr(246)+Chr(247)+Chr(248)+Chr(249), c, Chr(131)+Chr(163)+Chr(242)+Chr(243)+Chr(73)+Chr(105)+Chr(244)+Chr(245), .t.) Function MsToUkr(c) // ------------------------------------------------------------- // Перекодировка cp866 -> УкраинаГОСТ cp1125 // ------------------------------------------------------------- Return CharRepl(Chr(242)+Chr(243)+Chr(244)+Chr(245), c, Chr(244)+Chr(245), .t.) Но есть один нюанс. Текстовые данные визуал фокспрошной программой отображаются крякозябрами, хотя любой вьювер показывает читабельный текст. Причина - в обнулении клиппером 29 байта в заголовке файла, в котором хранится номер кодовой страницы и его надо восстановить. Можно было погуглить и узнать номер 866 кодовой страницы, скачать редактор бинарных файлов и изменить 29 байт. Но сделал попроще: в визуал фокспро открыл базу в монопольном режиме, он предложил выбрать кодовую страницу, выбрал 866, сохранил, подбросил в фокспрошную программу и символы начали отображаться верно. Andrey пишет: её нужно тестировать... Не прошла ваша утилита тест. почему перекодировка из win1125 в СР866, а не из dos1125 в СР866 Некоторые перекодируемые символы видны как например Chr(176) в CP866 Редко использую клиппер, подскажите почему не выходит из цикла по нажатию ESC? #include "inkey.ch" ... do while !eof() .and. lastkey()<>K_ESC ... enddo

petr707: ... do while !eof() .and. lastkey()<>K_ESC inkey() .. enddo .... Function ESC_WAIT(ntime) Local ret:=.f.,n:=0,lkey:=0 ntime:=IIF(ntime=NIL,60,ntime) keyboard(":"); inkey() for n=1 to 5 lkey:=INKEY(ntime) if lkey=K_ESC ret:=.t. EXIT endif next i return ret

Andrey: SergeyKorotun пишет: Не прошла ваша утилита тест. почему перекодировка из win1125 в СР866, а не из dos1125 в СР866 Давайте базу, я сам посмотрю.

SergeyKorotun: Andrey пишет: Давайте базу, я сам посмотрю. ЮЛЎЯ СТАНЎСЛАВ СВЎТЛАНА ЛЕОНЎД МАРЎЯ РА°СА ВАЛЕРЎЙ АНАТОЛЎЙ ВЎРА ЇВГЕНЎЙ ЎННА АНАСТАСЎЯ ЮРЎЙ Надо перекодировать: Перекодировка Украина ГОСТ cp1125 -> cp866 242 131 Є Г 243 163 є г 244 242 Ї Є 245 243 ї є 246 73 Ў I 247 105 ў i 248 244 ° Ї 249 245 ∙ ї Если возможно, занесите в 29 байт (по счету - 30-ый, отсчет байтов ведется с нуля) номер 866 кодовой страницы. Если знаете, как занести номер кодовой страницы в заглавие базы из клиппер 5.01, приведите код

petr707: Похоже , вряд ли это Вам поможет. 29 байт будет сброшен при первом же изменении таблицы движком DBFNTX clipper'a 5.01 Этот движок не знает такого понятия - кодовая страница. Вроде даже просто сократит размер заголовка DBF, подготовленной Fox'ом с указанием кодовой страницы

SergeyKorotun: petr707 пишет: 29 байт будет сброшен при первом же изменении таблицы движком DBFNTX clipper'a 5.01 Этот движок не знает такого понятия - кодовая страница. Вроде даже просто сократит размер заголовка DBF, подготовленной Fox'ом с указанием кодовой страницы Задача заключается в следующем: взять базу визуал фокспро 7, внести в нее изменение средствами клиппера, сохранить изменения, закрыть базу и только после этого в файле изменить (не средствами DBFNTX) значение 29 байта на значение равное номеру 866 кодовой страницы и после этого подкинуть базу фокспрошой проге. Инфа с инета: В среде FoxPro признак кодовой страницы (29-й байт) равен 0x65 для cp866 и 0xC9 для cp1251.

petr707: Так у Вас просто обмен данными между двумя программами или последовательная обработка. В этом случае не обязательно иметь полный общий DBF, в котором нужно менять байт в заголовке софтом нижнего уровня. 1) Экспорт(fox - в папку обмена для clipper) - импорт (clipper)- экспорт(для fox)- импорт ( fox - от cliiper) в качестве носителя данных - возможен DBF без кодовой странциы или простой ASCI txt-файл 2) Зачем нужен Clipper для этой задачи? Перекодировку можно сделать в рамках и только одного Fox: одну таблицу создать с одной кодовой страницей, вторую - с другой Преобразовать при копировании полей первого DBF во второй DBF или через TXT-файл

SergeyKorotun: Я ранее уже писал что задача решена, но хотелось больше ее автоматизировать. 1. Есть чужая откомпилированная прога на визуал фокспро 7. В базах бардак. 2. Есть чужая прога на фокспро 2.6, в базах которой порядок и там есть данные для первой проги. 3. Нужно из баз второй проги перенести некоторые данные в базы первой проги. Поскольку фокспро не знаю, с помощью этого форума написал программу на клиппере 5.01, которая собирает из нескольких таблиц второй проги базу, которую средствами клиппера перекодирую с CP1125 в CP866 и некоторые данные переношу в базу первой проги. 4. Поскольку клиппер обнулил 29 байт базы второй проги, инфа с второй проги будет во второй проге отображаться крякозябрами. (любой вьювер отображает данные нормально) 5. Чтобы изменить 29 байт, открываю в визуал фокспро 7 базу (use dbfname exclusive), фокспро сам выбрасывает окно с предложением выбрать кодовую страницу, выбираю 866 и выхожу с фокспро. В результате 29 байт заполнен номером 866 кодовой страницы. 6.Подбрасываю базу во вторую прогу, и после этого она нормально отображает символьные данные. 5 пункт хотелось бы выполнить средствами клиппера, чтобы все выполнить с помощью одной клипперовской программы

Andrey: SergeyKorotun пишет: ЮЛЎЯ СТАНЎСЛАВ СВЎТЛАНА ЛЕОНЎД МАРЎЯ РА°СА ВАЛЕРЎЙ АНАТОЛЎЙ ВЎРА ЇВГЕНЎЙ ЎННА АНАСТАСЎЯ ЮРЎЙ Надо перекодировать: Перекодировка Украина ГОСТ cp1125 -> cp866 Нужен DBF файл, я не могу собрать DBF из этих ИМЕН.... SergeyKorotun пишет: Если возможно, занесите в 29 байт (по счету - 30-ый, отсчет байтов ведется с нуля) номер 866 кодовой страницы. Вот примерно так (править под себя): #include "fileio.ch" FUNCTION Save29b(cFile) LOCAL hFile, nStatus, nSizeFile, cStream, cNewStr hFile := FOPEN( cFile, FO_WRITE ) nStatus := FERROR() IF nStatus # 0 ALERT( "ОШИБКА ! " + "Не смог открыть файл: "+cFile ) ELSE nSizeFile := FSEEK(hFile,0,FS_END) // конец файла = 2 IF nSizeFile == 0 // Считаем длину файла ALERT( "ОШИБКА ! " + "Файл: "+cFileInp+" ПУСТОЙ !") ELSE FSEEK(hFile,0,FS_SET) // начало файла = 0 cStream := Space( 30 ) FRead( nFileHandle, @cStream, 30 ) // считать 30 байт cNewStr := SUBSTR(cStream,1,28)+"вставить нужный вам ОДИН символ"+SUBSTR(cStream,30) FSEEK(hFile,0,FS_SET) // начало файла = 0 nStatus := FWRITE(hFile, cNewStr, 30) // запись 30 байт IF nStatus # 0 ALERT( "ОШИБКА ("+LTRIM(STR(nStatus))+") ! " + "Не смог записать файл: "+cFile ) ENDIF ENDIF ENDIF FCLOSE( hFile ) RETURN NIL

SergeyKorotun: Andrey пишет: Нужен DBF файл, я не могу собрать DBF из этих ИМЕН.... Перенеси имена в текстовый файл и добавь в базу родной утилитой клиппера - dbu.exe (F6, добавить, выбрать SDF и выбрать текстовый файл с именами) Andrey пишет: Вот примерно так (править под себя): Скрытый текст А ограничение на длину бинарного файла есть? Базы большие.

Andrey: SergeyKorotun пишет: Перенеси имена в текстовый файл и добавь в базу родной утилитой клиппера - dbu.exe (F6, добавить, выбрать SDF и выбрать текстовый файл с именами) Вот вы и проделайте эту работу. У меня русская 1251 кодировка на компе, ставить украинскую не когда. Если вам "влом" сделать DBF-ник и выложить здесь, то тогда продолжать разговор не чего ! SergeyKorotun пишет: А ограничение на длину бинарного файла есть? Базы большие. Запись идет 30 байт (ПЕРВЫХ) в базу, какой размер файла - это до лампочки !

SergeyKorotun: Andrey пишет: Вот вы и проделайте эту работу. У меня русская 1251 кодировка на компе, ставить украинскую не когда. Если вам "влом" сделать DBF-ник и выложить здесь, то тогда продолжать разговор не чего ! Я не знаю как вставить файл, поэтому базу импортировал в текстовый файл и несколько имен вставил в сообщение. Кнопка "файл с компьютера" делает переадресацию на сайт, на котором можно вставить только картинку. По поводу продолжения разговора: я уже пару раз писал, что перекодировку сделал программно, поэтому дополнительная утилита мне уже не нужна. Вы просили, я протестировал, нет в проге перекодировки с дос 1125 в дос 866. Если подскажите как присоединить файл, базу я вам выложу.

AlexMyr: SergeyKorotun пишет: Я не знаю как вставить файл Синяя стрелка вниз (файл с компьютера).

SergeyKorotun: AlexMyr пишет: Синяя стрелка вниз (файл с компьютера). при нажатии открывает http://photo.qip.ru/index.php на котором можно вставить только картинку

SergeyKorotun: Для Andrey отправил вам базу на 30195@mail.ru

Dima: SergeyKorotun пишет: при нажатии открывает http://photo.qip.ru/index.php на котором можно вставить только картинку файл можно выложить на любой файло обменник , к примеру files.mail.ru и продублировать сюда ссылку , что то типа http://files.mail.ru/FBD6TR (это просто пример)

SergeyKorotun: база для перекодировки из ср1125 в ср866 http://us.ua/1024583/

Andrey: SergeyKorotun пишет: база для перекодировки из ср1125 в ср866 Вот программа (и исходник) для перекодировки на МиниГуи - http://files.mail.ru/D2E69525A38D43F3B1734C3B07081E82 Можно сделать ехе-ник транслятор в любую кодовую страницу, где параметры задаются в командой строке, без диалога. Забыл язык указать правильно... Замените сами на эти строки: SET LANGUAGE TO UKRAINIAN SET CODEPAGE TO UKRAINIAN

SergeyKorotun: Доработанная функция Андрея по смене 29 байта базы //chr(101) for cp866 //chr(201) for cp1251 #include "fileio.ch" clear screen Set29biteInCP866("c:\proba.dbf") FUNCTION Set29biteInCP866(cFile) Local nFile, nStatus, nSizeFile, cStream nFile:=Fopen(cFile,FO_WRITE) nStatus:=FError() if ((nFile=-1) .or. (nStatus!=0)) alert("Номер вiдкритого файла: "+ltrim(str(nFile))+";Помилка! Неможливо вiдкрити файл:;"+cFile+";Код помилки ДОС: "+ltrim(str(nStatus))) return NIL endif nSizeFile := FSEEK(nFile,0,FS_END) //alert("Size file "+str(nSizeFile)) nSeek:=FSEEK(nFile,29,FS_SET) if nSeek<>29 alert("Не вдалося перемiстити курсор в 29 байт;для змiни номеру кодової сторiнки на CP866;Зробiть це за допомогою visual foxpro 7; use "+alltrim(cFile)+" exclusive; i виберiть 866 кодову сторiнку") Fclose(nFile) return NIL endif cStream=chr(101) //chr(201) for cp1251 nWriteBites:=Fwrite(nFile, cStream, 1) nStatus:=FError() if nWriteBites<>1 Alert("Не вдалося змiнити номер кодової сторiнки в файлi:;"+cFile+";"+"Код помилки ДОС: "+ltrim(str(nStatus))) endif FClose(nFile) Return NIL

SergeyKorotun: Задача скорее не имеет решение, но все же сформулирую. Клиентам раздается программа с заполненной данными базой: tin c 10 sum n 16.2 fio c 60 Клиент на основе данных этой базы с помощью программы создает новую базу: tin c 10 tin_cl c 10 sum n 16.2 sum_cl n 16.2 fio c 60 fio_cl c 60 Программа после поиска tin или fio в первой базе заполняет пары get полей (tin и tin_cl, sum и sum_cl, fio и fio_cl) одинаковыми значениями и если некоторые данные неверные, клиент должен исправить их в полях tin_cl, sum_cl, fio_cl. Поля tin, sum, fio недоступные для редактирования и отображают значения из первой базы. В первую базу заносились данные прогой, использующей 866 кодовую станицу (но через использование сторонних программ в первой базе присутствуют данные в разных кодировках. Во вторую базу в поля *_cl данные заносятся в кодовой странице 1125 (используется кейрус) Требуется данные в поле fio_cl перекодировать в 866 кодовую страницу.

Andrey: SergeyKorotun пишет: Во вторую базу в поля *_cl данные заносятся в кодовой странице 1125 (используется кейрус) Требуется данные в поле fio_cl перекодировать в 866 кодовую страницу. Сделай эту программу на хХарборе, отличия от Клипера минимальны, и заморачиватся с кодировками не будешь. Как сделать программу на хХарборе смотри http://clipper.borda.ru/?1-6-0-00000002-000-0-0-1355737108

SergeyKorotun: Andrey пишет: Сделай эту программу на хХарборе, отличия от Клипера минимальны, и заморачиватся с кодировками не будешь. Заморачиваться придется, так как исходная база (сp1125) берется с одной чужой проги, с помощью клипперовской проги правится база (ср866) другой чужой проги, используя данные с первой базы. Помогла бы утилита наподобии кейруса, но переводящяя коды символов не в ср1125, а в ср866. Существует такая?

Andrey: SergeyKorotun пишет: Существует такая? Не знаю !



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