Автор | Сообщение |
|
| |
Пост N: 139
Зарегистрирован: 12.07.06
|
|
Отправлено: 25.05.17 18:28. Заголовок: про кодировку
Помогите разобраться с кодировками В проекте использую dbf-файлы в кодировке 866, но потребовалось использовать один файл в кодировке 1251. Все нормально работает кроме случая, когда данные из файла с кодировкой 1251 запоминаю в переменные, а потом выдаю на экран. И получаю мусор. С данными в кодировке 866 все нормально В исходнике есть строки: REQUEST HB_LANG_RU866 REQUEST HB_LANG_RUWIN REQUEST HB_CODEPAGE_RU866 REQUEST HB_CODEPAGE_RU1251 ... HB_SetCodePage('RU1251')
|
|
|
Ответов - 26
, стр:
1
2
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 1478
Зарегистрирован: 09.10.06
|
|
Отправлено: 25.05.17 19:37. Заголовок: alex_II пишет: дан..
alex_II пишет: цитата: | данные из файла с кодировкой 1251 запоминаю в переменные, а потом выдаю на экран. И получаю мусор. |
| Скорее всего не установлена TermCP hb_SetCodePage('RU1251') hb_SetTermCP( hb_cdpTerm() ) или hb_SetTermCP( 'RU866', 'RU1251' ) Не понятно в какой кодировке у вас исходники, используете ли вы CODEPAGE вместе с USE и зачем все приводить к 'RU1251', если большинство данных в 'RU866' (здесь могу ошибаться) Одним словом - недостаточно исходных данных, но поиграйтесь с hb_SetTermCP/hb_SetDispCP(), уверен, что поможет (опять же если программа консольная)
|
|
|
|
| постоянный участник
|
Пост N: 1447
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.05.17 19:38. Заголовок: тут есть http://clip..
|
|
|
|
| |
Пост N: 140
Зарегистрирован: 12.07.06
|
|
Отправлено: 26.05.17 04:02. Заголовок: SergKis пишет: Не п..
SergKis пишет: цитата: | Не понятно в какой кодировке у вас исходники, используете ли вы CODEPAGE вместе с USE и зачем все приводить к 'RU1251', если большинство данных в 'RU866' (здесь могу ошибаться) |
| Использую MimiGui, программа не консольнная Исходники в кодировке 866 Базы открываю так: USE &Path_Dbf.&tFile ALIAS tfl NEW CODEPAGE 'RU1251' EXCLUSIVE USE &newName ALIAS old NEW CODEPAGE 'RU866' EXCLUSIVE Использование кодировки 1251 обусловлено тем что в 866 не работает функция Crypt
|
|
|
|
| постоянный участник
|
Пост N: 712
Зарегистрирован: 13.10.05
|
|
Отправлено: 26.05.17 06:40. Заголовок: Использование кодиро..
цитата: | Использование кодировки 1251 обусловлено тем что в 866 не работает функция Crypt |
| Странно, под хХарбор- консоль базы шифровал (Правда, для пробы. В реалии не потребовалось)
|
|
|
|
| |
Пост N: 6440
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.05.17 07:23. Заголовок: Vlad04 пишет: консо..
Vlad04 пишет: Под консолью (866) Harbour и у меня не было проблем. Использовал CharXor с обраткой. После как , одну задачу пришлось делать под Minigui + Harbour и базы в 866 с CharXor начались чудеса. Пробнул было заменить его на Crypt , не помогло.
|
|
|
|
| постоянный участник
|
Пост N: 1449
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.05.17 08:06. Заголовок: alex_II есть еще из..
alex_II есть еще из rdd\hbsix HB_FUNC( SX_ENCRYPT ) HB_FUNC( SX_DECRYPT ) попробуйте
|
|
|
|
| Администратор
|
Пост N: 3555
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.05.17 08:24. Заголовок: Если таблица открыта..
Если таблица открыта в кодировке, отличающейся от заданной в программе, то при чтении из нее данные автоматически перекодируются в кодировку, заданную в программе, а при записи - обратно. Таким образом, считанные данные, которые передаются функции Crypt, отличаются от тех, которые хранятся в таблице в части кодов для диапазона русских символов. Перекодировка cp1 - > cp2 -> cp2 в общем случае неэквивалентна, т.е. hb_translate(hb_translate(cc, 'RU866, 'RU1251'), 'RU1251, 'RU866') # cc hb_translate(hb_translate(cc, 'RU1251, 'RU866'), 'RU866, 'RU1251') # cc При использовании crypt получаются непечатные символы, и поэтому в таком случае функция crypt работает неправильно, и вина совсем не ее. Точно так же будет неправильно работать любой симметричный крипто-алгоритм.
|
|
|
|
| постоянный участник
|
Пост N: 1451
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.05.17 08:33. Заголовок: SerKis пишет попробу..
SerKis пишет имел ввиду для 866 базы
|
|
|
|
| Администратор
|
Пост N: 3556
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.05.17 09:02. Заголовок: Лучше шифровать табл..
Лучше шифровать таблицу встроенным методом rdd: dbInfo( DBI_ENCRYPT, cKey ) Чтобы затем работать с зашифрованной таблицей после открытия, надо будет задать пароль : dbInfo( DBI_PASSWORD, cKey )
|
|
|
|
| |
Пост N: 6441
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.05.17 09:11. Заголовок: Pasha А если шифров..
Pasha А если шифровать только одно поле , как тогда , учитывая что база в 866 а прога GUI и сырцы в 1251 ?
|
|
|
|
| постоянный участник
|
Пост N: 1452
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.05.17 09:21. Заголовок: Если использовать дл..
Если использовать для шифрованной базы rdd NSX #command USE <(db)> [VIA <rdd>] [ALIAS <a>] [<nw: NEW>] ; [<ex: EXCLUSIVE>] [<sh: SHARED>] [<ro: READONLY>] ; [CODEPAGE <cp>] [INDEX <(index1)> [, <(indexN)>]] ; [TRIGGER <trig>] [PASSWORD <pass>] => ; [sx_SetTrigger( TRIGGER_PENDING, <trig>, <rdd> );] <-trig-> ; [sx_SetPass( <pass>, 1, <rdd> );] <-pass-> ; dbUseArea( <.nw.>, <rdd>, <(db)>, <(a)>, ; iif( <.sh.> .OR. <.ex.>, ! <.ex.>, NIL ), <.ro.> [, <cp>] ) ; [; dbSetIndex( <(index1)> )] ; [; dbSetIndex( <(indexN)> )] должно работать нормуль и для 866 и для 1251
|
|
|
|
|
| Администратор
|
Пост N: 3557
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.05.17 09:37. Заголовок: Dima пишет: А если ..
Dima пишет: цитата: | А если шифровать только одно поле , как тогда , учитывая что база в 866 а прога GUI и сырцы в 1251 ? |
| Тогда такой способ не подходит, так как шифруются все символьные поля. Придется открывать базу, не указывая кодировки, и ручками расшифровывать и перекодировать нужные поля.
|
|
|
|
| постоянный участник
|
Пост N: 1453
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.05.17 09:42. Заголовок: Pasha пишет Придется..
Pasha пишет цитата: | Придется открывать базу, не указывая кодировки, и ручками расшифровывать и перекодировать нужные поля. |
| А разве по умолчанию (без CODEPAGE) не устанавливается для базы кодировка от программы ?
|
|
|
|
| Администратор
|
Пост N: 3558
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.05.17 10:21. Заголовок: SergKis пишет: А ра..
SergKis пишет: цитата: | А разве по умолчанию (без CODEPAGE) не устанавливается для базы кодировка от программы ? |
| Так и есть. При этом харбор просто читает данные из базы, не перекодируя их. Но если указать отличную от программы кодировку, криптофункции будут работать неправильно. Поэтому кодировку не надо указывать, и перекодировать данные для вывода на экран и печати вручную.
|
|
|
|
| Администратор
|
Пост N: 3559
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.05.17 13:32. Заголовок: Чтобы было понятнее,..
Чтобы было понятнее, почему трансляция из одной кодовой страницы в другую и обратно не дает первоначального значения. Берем символ с кодом 192 и транслируем его из cp866 в cp1251. В cp866 это символ псевдографики, он не транслируется, поэтому результат так и остается - 192. Затем транслируем его обратно из cp1251 в cp866. А в cp1251 код 192 - это русская буква "А", и она транслируется в код 128 - "А" в cp866. Получаем: 192 --> (cp866-cp1251) 192 --> (cp1251-cp866) 128 192 не равно 128
|
|
|
|
| |
Пост N: 6442
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.05.17 14:55. Заголовок: Pasha Спасибо что п..
Pasha Спасибо что прояснил. Вопрос а каким образом корректно перегнать сырцы из 866 в 1251 учитывая что в сырцах может быть псевдографика ? Думал простую прогу сделать которая в цикле обработает сырцы в папке и построчно сконвертит в 1251 с помощью Hb_oemtoansi , но чую будут косяки.
|
|
|
|
| Администратор
|
Пост N: 3560
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.05.17 15:29. Заголовок: У нас кажется уже бы..
У нас кажется уже был разговор на эту тему. Вопрос в том, что будет корректно для псевдографики и прочих непечатных символов, учитывая то, что в cp1251 ее нет как таковой и она там не нужна. Можно просто перекодировать весь текст с помощью того же far, и затем визуально пройтись по результату. У фара есть плагин visual compare, я его давно использую. Он выдает различия двух файлов, причем для каждого можно указать кодировку. Можно сравнить этим плагином исходный файл в cp866, и результирующий в cp1251. Различия будут как раз на такой "псевдографике". И в каждом случае принимать решение, что с ней делать.
|
|
|
|
| Администратор
|
Пост N: 3561
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.05.17 15:34. Заголовок: Кстати, вот способ п..
Кстати, вот способ перекодировки: Открыть файл в far, указать кодовую страницу OEM Затем: Ctrl+A Ctrl+X F8 Ctrl+V F2 Сомнительнльные символы фар покажет сам.
|
|
|
|
| |
Пост N: 6443
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.05.17 15:35. Заголовок: Pasha пишет: У нас ..
|
|
|
|
| |
Пост N: 5
Зарегистрирован: 06.10.12
|
|
Отправлено: 11.03.18 23:13. Заголовок: Уважаемые гуру.Подск..
Уважаемые гуру.Подскажите как получить украинскую "і" при вводе текста в поле. Использую следю команды REQUEST HB_CODEPAGE_UA866 REQUEST HB_CODEPAGE_UA1251 HB_CDPSELECT("UA866")
|
|
|
|
| Администратор
|
Пост N: 3698
Зарегистрирован: 23.05.05
|
|
Отправлено: 12.03.18 07:54. Заголовок: Никак. В кодировке 8..
Никак. В кодировке 866 нет украинской i. В 1251 есть.
|
|
|
|
|
| |
Пост N: 6
Зарегистрирован: 06.10.12
|
|
Отправлено: 12.03.18 17:32. Заголовок: Спасибо, очень жаль..
Спасибо, очень жаль
|
|
|
|
| Администратор
|
Пост N: 3701
Зарегистрирован: 23.05.05
|
|
Отправлено: 13.03.18 08:19. Заголовок: Вместо кодировок RU8..
Вместо кодировок RU866/RU1251 можно использовать UA1125/UA1251 UA1125 - это измененная 866, украинский стандарт 1992 года. Там i есть, только коды для некоторых символов отличаются от стандартной кодировки 866. Сам же когда-то делал эти кодировки, подзабыл уже, давно это было.
|
|
|
|
| |
Пост N: 342
Зарегистрирован: 16.12.08
|
|
Отправлено: 13.03.18 11:28. Заголовок: при старте REQUEST H..
при старте REQUEST HB_LANG_UAKOI8 REQUEST HB_CODEPAGE_UAKOI8 REQUEST HB_LANG_UAWIN в основной процедуре HB_SetCodePage("UAKOI8") HB_LANGSELECT("UAKOI8")
|
|
|
|
| |
Пост N: 65
Зарегистрирован: 25.07.06
|
|
Отправлено: 03.10.19 16:25. Заголовок: Pasha пишет: Вместо..
Pasha пишет: цитата: | Вместо кодировок RU866/RU1251 можно использовать UA1125/UA1251 UA1125 - это измененная 866, украинский стандарт 1992 года. Там i есть, только коды для некоторых символов отличаются от стандартной кодировки 866. Сам же когда-то делал эти кодировки, подзабыл уже, давно это было. |
|
А можно поподробнее, кусочек кода. Какие REQUEST и какие функции вызывать
|
|
|
|
| |
Пост N: 68
Зарегистрирован: 25.07.06
|
|
Отправлено: 09.10.19 17:17. Заголовок: вроде разобрался..
вроде разобрался
|
|
|
Ответов - 26
, стр:
1
2
All
[только новые]
|
|