On-line: PSP, Haz, гостей 0. Всего: 2 [подробнее..]
АвторСообщение



Пост 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')



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 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(),
уверен, что поможет (опять же если программа консольная)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1447
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.05.17 19:38. Заголовок: тут есть http://clip..

Спасибо: 0 
ПрофильЦитата Ответить



Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 712
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 26.05.17 06:40. Заголовок: Использование кодиро..



 цитата:
Использование кодировки 1251 обусловлено тем что в 866 не работает
функция Crypt


Странно, под хХарбор- консоль базы шифровал (Правда, для пробы. В реалии не потребовалось)

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6440
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.05.17 07:23. Заголовок: Vlad04 пишет: консо..


Vlad04 пишет:

 цитата:
консоль базы шифровал


Под консолью (866) Harbour и у меня не было проблем. Использовал CharXor с обраткой.
После как , одну задачу пришлось делать под Minigui + Harbour и базы в 866 с CharXor начались
чудеса. Пробнул было заменить его на Crypt , не помогло.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1449
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.05.17 08:06. Заголовок: alex_II есть еще из..


alex_II
есть еще из rdd\hbsix
HB_FUNC( SX_ENCRYPT )
HB_FUNC( SX_DECRYPT )
попробуйте

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост 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 работает неправильно, и вина совсем не ее.
Точно так же будет неправильно работать любой симметричный крипто-алгоритм.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1451
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.05.17 08:33. Заголовок: SerKis пишет попробу..


SerKis пишет
 цитата:
попробуйте


имел ввиду для 866 базы

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3556
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.05.17 09:02. Заголовок: Лучше шифровать табл..


Лучше шифровать таблицу встроенным методом rdd:
dbInfo( DBI_ENCRYPT, cKey )

Чтобы затем работать с зашифрованной таблицей после открытия, надо будет задать пароль :
dbInfo( DBI_PASSWORD, cKey )


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6441
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.05.17 09:11. Заголовок: Pasha А если шифров..


Pasha
А если шифровать только одно поле , как тогда , учитывая что база в 866 а прога GUI и сырцы в 1251 ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3557
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.05.17 09:37. Заголовок: Dima пишет: А если ..


Dima пишет:

 цитата:
А если шифровать только одно поле , как тогда , учитывая что база в 866 а прога GUI и сырцы в 1251 ?



Тогда такой способ не подходит, так как шифруются все символьные поля. Придется открывать базу, не указывая кодировки, и ручками расшифровывать и перекодировать нужные поля.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1453
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.05.17 09:42. Заголовок: Pasha пишет Придется..


Pasha пишет
 цитата:
Придется открывать базу, не указывая кодировки, и ручками расшифровывать и перекодировать нужные поля.


А разве по умолчанию (без CODEPAGE) не устанавливается для базы кодировка от программы ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3558
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.05.17 10:21. Заголовок: SergKis пишет: А ра..


SergKis пишет:

 цитата:
А разве по умолчанию (без CODEPAGE) не устанавливается для базы кодировка от программы ?



Так и есть. При этом харбор просто читает данные из базы, не перекодируя их.
Но если указать отличную от программы кодировку, криптофункции будут работать неправильно. Поэтому кодировку не надо указывать, и перекодировать данные для вывода на экран и печати вручную.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост 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


Спасибо: 1 
ПрофильЦитата Ответить
администратор




Пост N: 6442
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.05.17 14:55. Заголовок: Pasha Спасибо что п..


Pasha
Спасибо что прояснил.
Вопрос а каким образом корректно перегнать сырцы из 866 в 1251 учитывая что в сырцах может быть псевдографика ?
Думал простую прогу сделать которая в цикле обработает сырцы в папке и построчно сконвертит в 1251 с помощью Hb_oemtoansi ,
но чую будут косяки.


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3560
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.05.17 15:29. Заголовок: У нас кажется уже бы..


У нас кажется уже был разговор на эту тему.
Вопрос в том, что будет корректно для псевдографики и прочих непечатных символов, учитывая то, что в cp1251 ее нет как таковой и она там не нужна.
Можно просто перекодировать весь текст с помощью того же far, и затем визуально пройтись по результату.
У фара есть плагин visual compare, я его давно использую. Он выдает различия двух файлов, причем для каждого можно указать кодировку.
Можно сравнить этим плагином исходный файл в cp866, и результирующий в cp1251. Различия будут как раз на такой "псевдографике". И в каждом случае принимать решение, что с ней делать.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3561
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.05.17 15:34. Заголовок: Кстати, вот способ п..


Кстати, вот способ перекодировки:
Открыть файл в far, указать кодовую страницу OEM
Затем:
Ctrl+A Ctrl+X F8 Ctrl+V F2
Сомнительнльные символы фар покажет сам.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6443
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.05.17 15:35. Заголовок: Pasha пишет: У нас ..


Pasha пишет:

 цитата:
У нас кажется уже был разговор на эту тему.


Да был.

Печаль.
Значит вот такие рамочки в 1251 уже и не сделать...
http://shot.qip.ru/00TIHy-1oq4QIimw

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 5
Зарегистрирован: 06.10.12
ссылка на сообщение  Отправлено: 11.03.18 23:13. Заголовок: Уважаемые гуру.Подск..


Уважаемые гуру.Подскажите как получить украинскую "і" при вводе текста в поле. Использую следю команды
REQUEST HB_CODEPAGE_UA866
REQUEST HB_CODEPAGE_UA1251
HB_CDPSELECT("UA866")

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 26 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 408
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет