Форум » [x]Harbour » Как проверить в какой кодировке строка ? » Ответить

Как проверить в какой кодировке строка ?

Andrey: Подскажите пожалуйста есть ли в хХарборе функция проверки в какой кодировке строка: OEM(RU866) или WIN(RU1251) ?

Ответов - 19

petr707: it's impossible, may be ? Строка = "1234....90" в какой кодировке ? А еще есть Unicode...

Andrey: petr707 пишет: Строка = "1234....90" в какой кодировке ? Ну это из области фигни.... Просто при приеме данных из РКЦ Харькова БД-оплат содержит адрес и фио в кодировке, то OEM, то WIN. Типа "¦+T+T ¦+T+L¦+T¦L -юь 29 ¦т. 49" и "T¦L++=¦+ T.=." или "ПОСЕЛ КОВШАРОВКА Дом 29 Кв. 49" и "МУСИЯК ИГОРЬ ВЛАДИ". Вот я хочу сделать преобразование автоматом. Определить что за кодировка в строке, а потом преобразовать ее для своей БД.

gfilatov2002: Посмотри функцию IsOemText( cText ) из поставки библиотеки Минигуи Пример использования: [pre2] if IsOemText(wfield) wfield:=hb_oemtoansi(wfield) endif [/pre2]


PSP: Андрей, нет такой функции и быть не может.

Andrey: gfilatov2002 пишет: Посмотри функцию IsOemText( cText ) из поставки библиотеки Минигуи Нашел твою функцию, а как её к хХарбору прикрутить ? /////////////////////////////////////////////////////////// #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <какие еще нужны ??? > // Grigory Filatov <gfilatov@inbox.ru> HMG 1.1 Experimental Build 17d HB_FUNC( ISOEMTEXT ) { LPBYTE pString = ( LPBYTE ) hb_parc( 1 ); WORD w = 0, wLen = ( WORD ) hb_parclen( 1 ); BOOL bOem = FALSE; while( w < wLen && !bOem ) { bOem = pString[ w ] >= 128 && pString[ w ] <= 168; w++; } hb_retl( bOem ); } #pragma ENDDUMP

Pasha: В двух кодовых таблицах есть пересекающиеся диапазоны кодов, а есть такие, которые присутствуют в 866 и отсутствуют в 1251, и наоборот. Таким образом, если код символа приходится на такой диапазон, можно считать, что строка в кодировке 866, или 1251 Диапазон кодов для 866: 128-175 Диапазон кодов для 1251: 192-223, 248-255 Общий диапазон для 2-х кодировок: 224-247

PSP: Мда, похоже, я погорячился...

Andrey: gfilatov2002 пишет: Посмотри функцию IsOemText( cText ) из поставки библиотеки Минигуи Обнаружил очередную непонятку. МиниГуи последний.[pre2] // приводим всегда к WIN-кодировке ? IsOemText(cMsg), cTitle If IsOemText(cMsg) cMsg := HB_OemToAnsi(cMsg) Endif ?? "change->",IsOemText(cMsg) [/pre2] Результат: [pre2].T. , "имя файла", change-> .T.[/pre2] Строка остаётся в OEM кодировке.... Почему ?

Andrey: Pasha пишет: Диапазон кодов для 1251: 192-223, 248-255 Есть файл в кодировке 1251. Но когда задаёшь IsOemText(cFile), то эта функция выдаёт .T. Что не так в файле ? Как привести файл в чётко читаемую кодировку 1251 ?

Dima: Andrey пишет: Но когда задаёшь IsOemText(cFile) cFile это имя файла или его содержимое ?

SergKis: Andrey Сделай prg файл в RU866, например Code_RU866.prg с содержимым[pre2] // Этот файл в OEM кодировке RU866 FUNC nCharSet( cTxt ) LOCAL cC, nN LOCAL nR := 2 LOCAL cT := "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя" FOR EACH cC IN @cTxt If ( nN := At(cC, cT) ) > 0 nR := 1 EXIT EndIF NEXT RETURN nR [/pre2] Если вернет 1 - RU866, иначе RU1251

SergKis: PS Можно добавить LOCAL cdp := hb_cdpSelect("RU866") ... hb_cdpSelect( cdp ) RETURN nR

Andrey: Dima пишет: cFile это имя файла или его содержимое ? Содержимое ! У меня файлы создаются текстовые. А база в 866 кодировке. Что то оттуда берётся и копируется в текстовый файл-журнал. У многих файл нормальный, а у некоторых непонятки, т.е. файл ЧЕТКО в кодировке 1251. Но когда задаёшь IsOemText(cFile), то эта функция выдаёт .T. Что не так в файле ? Как привести файл в чётко читаемую кодировку 1251 ? Какие символы удалить нужно, чтобы функция IsOemText(cFile) возвращала .F. ?

Dima: Andrey Сергей выше описал вариант

Andrey: Dima пишет: Сергей выше описал вариант Это не подходит. Файл уже в кодировке 1251.

Dima: Andrey пишет: У многих файл нормальный, а у некоторых непонятки, т.е. файл ЧЕТКО в кодировке 1251. А как он может быть в кодировке 1251 если в него пишет твоя же прога в кодировке 866 ?

Andrey: Dima пишет: А как он может быть в кодировке 1251 если в него пишет твоя же прога в кодировке 866 ? Туда просто попадают символы какие то из 866 кодировки... Вот и хотелось бы понять какие символы удалить/заменить допустим хотя бы через CharRepl() чтобы IsOemText() не сбоила... Хотя наверное нужно не мучиться, а сделать выбор через менюшку открытие файла без автоопределения (т.е. без IsOemText() ).

Dima: Andrey пишет: Туда просто попадают символы какие то из 866 кодировки... Вот и хотелось бы понять какие символы удалить/заменить допустим хотя бы через CharRepl() Так вытащи такой текст и проанализируй

SergKis: Andrey [pre2] FUNCTION MsgEdit(cMsg, cTitle, cIcoRes, nIcoSize, aWinFont, aWinColor, cFileCnf ) ... DEFAULT cFileCnf := "MsgEditUser.ini" hb_memowrit('_2.txt.', cMsg) // назначить цвета окна aBackColor := aWinColor[1] aFontColor := aWinColor[2] ... @ 0, 0 LABEL Lbl0 WIDTH nWidth HEIGHT 12 VALUE "" TRANSPARENT DRAW ICON IN WINDOW &cFormName AT nG, nG PICTURE cIcoRes WIDTH nIcoSize HEIGHT nIcoSize COLOR aBackColor hb_memowrit('_2c.txt.', cMsg) nCMemo := nG + nIcoSize + nG @ nG, nCMemo EDITBOX Edit_Memo WIDTH nWMemo HEIGHT nHMemo ; VALUE cMsg READONLY ; BACKCOLOR {240, 240, 240} FONTCOLOR aFontColor nY := This.Edit_Memo.Row ... [/pre2] _2.txt в кодировке RU1251 _2c.txt уже фиг знает в чем



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