Автор | Сообщение |
|
| постоянный участник
|
Пост N: 2154
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.04.12 15:10. Заголовок: Как проверить в какой кодировке строка ?
Подскажите пожалуйста есть ли в хХарборе функция проверки в какой кодировке строка: OEM(RU866) или WIN(RU1251) ?
|
|
|
Ответов - 19
[только новые]
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 08.04.12 16:43. Заголовок: Как проверить в какой кодировке строка ?
it's impossible, may be ? Строка = "1234....90" в какой кодировке ? А еще есть Unicode...
|
|
|
|
| постоянный участник
|
Пост N: 2157
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.04.12 19:07. Заголовок: petr707 пишет: Стро..
petr707 пишет: цитата: | Строка = "1234....90" в какой кодировке ? |
| Ну это из области фигни.... Просто при приеме данных из РКЦ Харькова БД-оплат содержит адрес и фио в кодировке, то OEM, то WIN. Типа "¦+T+T ¦+T+L¦+T¦L -юь 29 ¦т. 49" и "T¦L++=¦+ T.=." или "ПОСЕЛ КОВШАРОВКА Дом 29 Кв. 49" и "МУСИЯК ИГОРЬ ВЛАДИ". Вот я хочу сделать преобразование автоматом. Определить что за кодировка в строке, а потом преобразовать ее для своей БД.
|
|
|
|
| moderator
|
Пост N: 366
Зарегистрирован: 11.02.10
|
|
Отправлено: 08.04.12 19:12. Заголовок: Посмотри функцию Is..
Посмотри функцию IsOemText( cText ) из поставки библиотеки Минигуи Пример использования: цитата: | if IsOemText(wfield) wfield:=hb_oemtoansi(wfield) endif |
|
|
|
|
|
| постоянный участник
|
Пост N: 757
Зарегистрирован: 27.01.07
|
|
Отправлено: 08.04.12 19:13. Заголовок: Андрей, нет такой фу..
Андрей, нет такой функции и быть не может.
|
|
|
|
| постоянный участник
|
Пост N: 2159
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.04.12 19:57. Заголовок: gfilatov2002 пишет: ..
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
|
|
|
|
| Администратор
|
Пост N: 2340
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.04.12 20:12. Заголовок: В двух кодовых табли..
В двух кодовых таблицах есть пересекающиеся диапазоны кодов, а есть такие, которые присутствуют в 866 и отсутствуют в 1251, и наоборот. Таким образом, если код символа приходится на такой диапазон, можно считать, что строка в кодировке 866, или 1251 Диапазон кодов для 866: 128-175 Диапазон кодов для 1251: 192-223, 248-255 Общий диапазон для 2-х кодировок: 224-247
|
|
|
|
| постоянный участник
|
Пост N: 758
Зарегистрирован: 27.01.07
|
|
Отправлено: 08.04.12 21:18. Заголовок: Мда, похоже, я погор..
Мда, похоже, я погорячился...
|
|
|
|
| постоянный участник
|
Пост N: 6484
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.10.19 23:23. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Посмотри функцию IsOemText( cText ) из поставки библиотеки Минигуи |
| Обнаружил очередную непонятку. МиниГуи последний. // приводим всегда к WIN-кодировке ? IsOemText(cMsg), cTitle If IsOemText(cMsg) cMsg := HB_OemToAnsi(cMsg) Endif ?? "change->",IsOemText(cMsg) Результат: .T. , "имя файла", change-> .T. Строка остаётся в OEM кодировке.... Почему ?
|
|
|
|
| постоянный участник
|
Пост N: 6486
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.10.19 15:25. Заголовок: Pasha пишет: Диапаз..
Pasha пишет: цитата: | Диапазон кодов для 1251: 192-223, 248-255 |
| Есть файл в кодировке 1251. Но когда задаёшь IsOemText(cFile), то эта функция выдаёт .T. Что не так в файле ? Как привести файл в чётко читаемую кодировку 1251 ?
|
|
|
|
| |
Пост N: 7121
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.10.19 15:37. Заголовок: Andrey пишет: Но ко..
Andrey пишет: цитата: | Но когда задаёшь IsOemText(cFile) |
| cFile это имя файла или его содержимое ?
|
|
|
|
| постоянный участник
|
Пост N: 2953
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.10.19 15:42. Заголовок: Andrey Сделай prg ф..
Andrey Сделай prg файл в RU866, например Code_RU866.prg с содержимым // Этот файл в 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 Если вернет 1 - RU866, иначе RU1251
|
|
|
|
|
| постоянный участник
|
Пост N: 2954
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.10.19 15:55. Заголовок: PS Можно добавить L..
PS Можно добавить LOCAL cdp := hb_cdpSelect("RU866") ... hb_cdpSelect( cdp ) RETURN nR
|
|
|
|
| постоянный участник
|
Пост N: 6487
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.10.19 16:11. Заголовок: Dima пишет: cFile э..
Dima пишет: цитата: | cFile это имя файла или его содержимое ? |
| Содержимое ! У меня файлы создаются текстовые. А база в 866 кодировке. Что то оттуда берётся и копируется в текстовый файл-журнал. У многих файл нормальный, а у некоторых непонятки, т.е. файл ЧЕТКО в кодировке 1251. Но когда задаёшь IsOemText(cFile), то эта функция выдаёт .T. Что не так в файле ? Как привести файл в чётко читаемую кодировку 1251 ? Какие символы удалить нужно, чтобы функция IsOemText(cFile) возвращала .F. ?
|
|
|
|
| |
Пост N: 7122
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.10.19 16:15. Заголовок: Andrey Сергей выше ..
Andrey Сергей выше описал вариант
|
|
|
|
| постоянный участник
|
Пост N: 6488
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.10.19 16:18. Заголовок: Dima пишет: Сергей ..
Dima пишет: цитата: | Сергей выше описал вариант |
| Это не подходит. Файл уже в кодировке 1251.
|
|
|
|
| |
Пост N: 7123
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.10.19 16:42. Заголовок: Andrey пишет: У мно..
Andrey пишет: цитата: | У многих файл нормальный, а у некоторых непонятки, т.е. файл ЧЕТКО в кодировке 1251. |
| А как он может быть в кодировке 1251 если в него пишет твоя же прога в кодировке 866 ?
|
|
|
|
| постоянный участник
|
Пост N: 6489
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.10.19 16:56. Заголовок: Dima пишет: А как о..
Dima пишет: цитата: | А как он может быть в кодировке 1251 если в него пишет твоя же прога в кодировке 866 ? |
| Туда просто попадают символы какие то из 866 кодировки... Вот и хотелось бы понять какие символы удалить/заменить допустим хотя бы через CharRepl() чтобы IsOemText() не сбоила... Хотя наверное нужно не мучиться, а сделать выбор через менюшку открытие файла без автоопределения (т.е. без IsOemText() ).
|
|
|
|
| |
Пост N: 7124
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.10.19 16:58. Заголовок: Andrey пишет: Туда ..
Andrey пишет: цитата: | Туда просто попадают символы какие то из 866 кодировки... Вот и хотелось бы понять какие символы удалить/заменить допустим хотя бы через CharRepl() |
| Так вытащи такой текст и проанализируй
|
|
|
|
| постоянный участник
|
Пост N: 2955
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.10.19 17:05. Заголовок: Andrey FUNCTION Ms..
Andrey 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 ... _2.txt в кодировке RU1251 _2c.txt уже фиг знает в чем
|
|
|
|