:: Visual Foxpro, Foxpro for DOS
Вопрос по кодировкам
aboda
Автор

Сообщений: 10
Дата регистрации: 15.08.2010
Доброго всем времени суток !
Такой вопрос. Есть программа которая работает только с кодировкой 1252(имхо), если работать из под английской версии винды, программа работает нормально и даёт доступ к базе данных, но если установить на русскую винду - то читать данные с dbf файлов отказывается. На англ. винде если вводить данные на русском языке, то прога данные пишет в базу, но при чтении выдает "кракозябры". Дайте совет, можна ли решить такую проблему?

PS
Не ругайте сильно за такой вопрос. Я не програмист + еще очень молод.
Заранее благодарен Всем !
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
of63

Сообщений: 25415
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Как Вы узнали, что база данных (или файлы dbf) в кодировке 1252?
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
Alsim

Сообщений: 3637
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
подозреваю что в config.fpw
у вас нет строки:
codepage=1251
где 1251 или другое значение то что Вам нужно для счастья
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
aboda
Автор

Сообщений: 10
Дата регистрации: 15.08.2010
of63
Как Вы узнали, что база данных (или файлы dbf) в кодировке 1252?
Ища решение проблемы, увидел статью:
www.foxclub.ru
После того, как скачал и записал файл FOXPRO.INT, появился доступ к базам данных. И ситуация приобрела вид, в точности как описано в статье. То есть, когда в программе пишу "Вася", записываю в базу, после чтения получаю "Аася". С чего и сделал вывод (а также посмотрев с помощью редактора в кодировках 1251 и 1252), что бд сохранена в кодировке 1251, а приложение ее читает как 1252.
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
aboda
Автор

Сообщений: 10
Дата регистрации: 15.08.2010
Alsim
подозреваю что в config.fpw
у вас нет строки:
codepage=1251
где 1251 или другое значение то что Вам нужно для счастья
К сожалению с foxpro и базами dbf столкнулся впервые, поэтому совсем не понимаю роли этого файла в моем случае...
1. Если он нужен, куда его записать?
2. У меня создалось впечатление, что config.fpw нужен на этапе создания программ, баз к ним и прочее. В моем случае надо использовать уже написанную кем-то программу, а именно заставить ее нормально сохранять и потом читать информацию о клиентах на русском языке, которую она пишет в файл *.dbf.
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
Alsim

Сообщений: 3637
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
1. рядом с исполняемым файлом и файлом проекта при разработке
2. впечатление создалось обманчивое
3. foxpro.int нужен только для FPD
удачи
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
aboda
Автор

Сообщений: 10
Дата регистрации: 15.08.2010
Открывал dbf-ку с помощью vfp8.0, так вот он отображал содержимое неправильно, точно так, как моя программа. Поместил рядом с базой файл config.fpw и вписав в него CODEPAGE=1252 добился желаемого, но только для фокспро. Программа же упорно отображает данные неверно.
config.fpw есть также рядом с исполняемым файлом программы.
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
Если у вас программа написана на FoxPro for DOS, то конфиг.файл по умолчанию называется config.fp, а не config.fpw. Выложите здесь какую-нибудь небольшую таблицу - вам точно скажут и версию Фокса (FPD или VFP) и кодовую страницу dbf, если она в ней указана.
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
aboda
Автор

Сообщений: 10
Дата регистрации: 15.08.2010
Присоединил
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
Alsim

Сообщений: 3637
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
? CPDBF("customer")
дает 936 кодировку.
т.е. не DOS 866 и не Win 1251
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
Alsim

Сообщений: 3637
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
при помощи cpzero.prg пометил его как 1251 и АСЯ стала Вася
см вложение
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
aboda
Автор

Сообщений: 10
Дата регистрации: 15.08.2010
значит надо
codepage=936
?
не помогло ((
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
Alsim

Сообщений: 3637
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
значит надо:
1 пометить свою таблицу как 1251 (см мое вложение)
2 codepage = 1251
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
aboda
Автор

Сообщений: 10
Дата регистрации: 15.08.2010
Alsim
при помощи cpzero.prg пометил его как 1251 и АСЯ стала Вася см вложение
Да, прога его скушала, работает отлично )
Правильным ли будет решение, все нужные мне файлы пометить в 1251?
P.S. С опозданием отвечаю )



Исправлено 2 раз(а). Последнее : aboda, 15.08.10 14:50
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
Alsim

Сообщений: 3637
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
я не ясновидящий, лично я взял бы и просто попробовал.
кстати "о птичках"
cpzero.prg если не знаете что это и где это, лежит в папке с установленным фоксом в папке \Tools\cpzero
удачи
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
aboda
Автор

Сообщений: 10
Дата регистрации: 15.08.2010
Спасибо большое за участие и помощь, стало ясно что надо сделать и о чем много почитать!
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
aboda
Автор

Сообщений: 10
Дата регистрации: 15.08.2010
Выполняю:
DO "cpzero.prg" WITH "c:\lanccd\dat\customer.dbf", 1251
Пробую открыть customer.dbf и ошибка:
Collating sequence 'PYNYIN' is not found
Если же не указываю кодовую станицу:
DO "cpzero.prg" WITH "c:\lanccd\dat\customer.dbf"
Все работает.
И еще, где можно увидеть результат выполнения CPDBF() ?
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
aboda
Автор

Сообщений: 10
Дата регистрации: 15.08.2010
Все, разобрался...
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
Эта ошибка возникла из-за несоответствия кодовой страницы dbf (1251) и коллэйта PYNYIN (Simplified Chinese), прописанного в индексных тегах (в файлах cdx).

Тут уже возможны варианты дальнейших действий:
1) как поведет себя программа, если просто потереть все *.cdx файлы? Откажется работать или создаст индексы автоматически? Если создаст, то с каким коллэйтом? Снова PYNYIN или MACHINE? Кодовая страница всех dbf должна быть при этом = 0 (или исходная, но не русская). При этом, если CODEPAGE в конфиге не будет китайский (936), то программа может и выдать ошибку при попытке установить коллэйт PYNYIN тем или иным образом (SET COLLATE или INDEX ON ... COLLATE ...)
2) Есть ли в программе возможность выполнить переиндексацию таблиц? Если есть, то те же вопросы, что и в п.1.
3) Если в индексах китайский коллэйт лишь для красоты, а реально не используется, то программу видимо можно заставить нормально работать. Если же нет, то могут быть проблемы при работе с русской кодировкой, например придется строго соблюдать регистр символов, иначе возможно поиск будет происходить неверно.
4) Если в программе возможности переиндексации нет, то это можно сделать руками через Фокс, или даже в Hex-редакторе, заменив текст PYNYIN во всех тегах *.cdx файлов на нуль-байты.

Цитата:
И еще, где можно увидеть результат выполнения CPDBF()
Откройте в Фоксе все интересующие таблицы и в командном окне:
DISP STATUS
увидите и кодовые страницы всех таблиц и коллэйт последовательности тегов их индексных файлов.
или
?CPDBF(<псевдоним таблицы>)
например
?CPDBF('customer')



Исправлено 2 раз(а). Последнее : akvvohinc, 15.08.10 18:22
Ratings: 0 negative/0 positive
Re: Вопрос по кодировкам
pioner-v

Сообщений: 1656
Дата регистрации: 01.05.2010
aboda
Alsim
при помощи cpzero.prg пометил его как 1251 и АСЯ стала Вася см вложение
Да, прога его скушала, работает отлично )
Правильным ли будет решение, все нужные мне файлы пометить в 1251?
P.S. С опозданием отвечаю )
Если Вы все файлы после обработки "оставляете" у себя, то - ответ "Да".
А если после обработки необходимо "вернуть назад поставщику файлов", то - ответ тоже "Да", но затем надо файлу возвратить "родительскую" кодовую страницу.
Я не использую программу CPZERO(), а программным путем меняю кодовую страницу. Вот пример кода(размещается в методе Click кнопки "Открыть"):
* Выбор файла для работы
cProvFile1=GETFILE("Таблицы DBF:*.dbf","Файл:","Выбрать",0,"Выбор файла")
IF LEN(cProvFile1)<1 && если не выбрали, то ничего не делаем...
RETURN
ENDIF
hdbc=fopen(cProvFile1,2) && открытие файла: чтение и запись с буферизацией
IF hdbc<0
messagebox(Не удалось открыть\прочитать файл'+CHR(13)+'"'+cProvFile1+'" !')
RETURN
ENDIF
* Анализ 30 байта (признак кодовой страницы)
=fseek(hdbc,29) && "сдвигаемся" на 29 байт от начала файла
b1=FREAD(hdbc,1) && читаем один байт (в символьном представлении)
b1=ASC(b1) && переводим символьное представление байта в число...
DO case
CASE b1=0 && Если код страницы = 0
CdPg1=0 && Запоминаем код "начальной" кодовой страницы, чтобы потом вернуть назад
=fseek(hdbc,29) && "сдвигаемся" на 29 байт от начала файла
=FWrite(hdbc,CHR(101)) && пишем новую кодовую страницу 866
CASE b1=101 && Если код страницы=866
CdPg1=866
CdPgTxt1='866'
CASE b1=3 && Если код страницы=1252
CdPg1=1252
=fseek(hdbc,29)
=FWrite(hdbc,CHR(201)) && пишем новую кодовую страницу = 1251
OTHERWISE
CdPg1=1251
CdPgTxt1='1251'
ENDCASE
=fclose(hdbc)
hdbc=-1
* Открытие файла (основная кодовая страница= 1251)
USE &cProvFile1. ALIAS Prov1 IN 0
В примере работа с СР=866,1251,1252 и 0. Если есть другие СР, то код надо отредактировать(дополнить).
Переменная CdPg описана как PUBLIC.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 14 (Гостей: 14)

© 2000-2024 Fox Club 
Яндекс.Метрика