Форум » 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.



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