powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Почему кодовая страница меняется сама?
31 сообщений из 31, показаны все 2 страниц
Почему кодовая страница меняется сама?
    #32586333
Forzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сабж такой....

Прога конвертит текстовый файл в DBF, кодовая страница прописана в config.fpw включённый в ехе, в какой-то момент времени при конвертации текст становится нечитабелен, хотя до этого на той-же машине, не перегружаясь, всё работало как надо.... В чём грабли???
Вопрос жизненно важный!
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586361
Фотография SAM-FoxPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А текстовый файл в какой кодировке?
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586370
Forzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кодовая страница 1251
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586393
Forzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет, ошибся, текст DOS.
нужно чтоб и в базе тоже был текст DOS
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586439
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Forzyв какой-то момент времени при конвертации текст становится нечитабелен, хотя до этого на той-же машине, не перегружаясь, всё работало как надо....

-) Как именно ты читаешь этот текстовый файл
-) Как именно создается этот текстовый файл

Forzyнет, ошибся, текст DOS.
нужно чтоб и в базе тоже был текст DOS

-) Какая версия FoxPro
-) Если текст DOS, то это кодовая страница 866. Однако для версий Visual FoxPro если не хочешь кучи проблем установи CODEPAGE=1251 для среды FoxPro
-) Есть команды конвертации кодовой страницы, но необходимо знать как именно происходит запись/чтение в тектовый файл
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586466
Forzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Текстовый файл беру готовый
далее его в массив,
из массива в базу.

lcString=FileToStr('file.txt')

lcString=CPCONVERT(866,1251,m.lcString)

LOCAL laString(1)

=ALINES(laString,m.lcString)

LOCAL lnI, lcOneLine

FOR lnI=1 TO ALEN(laString,1)
lcOneLine=laString[lnI]
ln2=lcOneLine
select f
APPEND BLANK
nd WITH VAL(SubStr(lcOneLine,75,3)),
.....
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586480
Forzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Базу создаю так

IF !FILE('file.dbf')
CREATE TABLE .....
USE ('tmp_file') IN a
COPY TO ('file') TYPE FOX2X as 866
USE
DELETE FILE ('tmp_file.dbf')
ENDIF
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586721
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ForzyТекстовый файл беру готовый

Вот в этом-то и проблема. Дело в том, что в текстовом файле в принципе нет никакого признака, определяющего в какой именно кодовой странице он создан.

Поэтому, когда ты делаешь CPCONVERT(866,1251,m.lcString) ты только предполагаешь , что этот текстовый файл создан именно в кодовой странице 866. Но фактически, проверить это никак невозможно. Если тебе подсунули текстовый файл созданный в другой кодировке (например в 1251), то конвертация через CPCONVERT() и приведет к таким непредсказуемым результатам.

Пробовал просмотреть этот текстовый файл блокнотом? Если нормальный текст, значит этот файл в кодовой странице 1251, а не 866 как ожидалось.


PS: построчный разбор текстового файла - это очень медленная операция. Лучше использовать APPEND FROM (если это возможно). Пусть даже разбивка по полям будет не очень точная. Потом можно подкорректировать разбивку.
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586770
Forzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробовал, в блокноте текст нечитаем.
866 значит кодировка
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586796
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Forzyпопробовал, в блокноте текст нечитаем.
866 значит кодировка

Нет. Это всего-лишь значит, что НЕ 1251, а какая именно - неизвестно.

Просто в среде FoxPro пробовал открыть этот текстовый файл командой:

MODIFY COMMAND MyFile.txt AS 866
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586813
Forzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробовал, всё читается.
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586854
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В FoxPro текущая кодовая страница устанавливается в момент запуска среды FoxPro и в процессе работы уже не может быть изменена.

Наиболее вероятная причина - это все-таки некорректноая устновка CODEPAGE в файле Config.FPW. Там должно быть

CODEPAGE=1251

Этот факт проверяется следующим образом

SYS(2019) - путь доступа к файлу конфигурации
CPCURRENT() - без параметра - текущая кодовая страница FoxPro

Еще одна причина - это возможная "потеря" переменных. Но это надо смотреть код. Отобрази начало полученного файла, что-то вроде:

Код: plaintext
1.
2.
lcString=FileToStr('file.txt')
lcString=CPCONVERT( 866 , 1251 ,m.lcString) 
MessageBox(LEFT(m.lcString, 50 ))

Насколько читаемый текст получится. И будет ли он содержать именно файл, а не что-то другое.
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586915
Forzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iF FILE('file.exp')

LOCAL lcString

IF !FILE('basa.dbf')
CREATE TABLE ('tmp_basa.dbf') (pole1 c(5),.........)
USE ('tmp_basa') IN a
COPY TO ('basa') TYPE FOX2X as 866
USE
DELETE FILE ('tmp_basa.dbf')
ENDIF

USE ('basa') IN f
a_fil=pp_arh+SUBSTR(DTOC(date(),1),5,2)+SUBSTR(DTOC(date(),1),7,2)+'_'+SUBSTR(TIME(),1,2)+SUBSTR(TIME(),4,2)+SUBSTR(TIME(),7,2)+'.exp'
lcString=FileToStr('file.exp')

lcString=CPCONVERT(866,1251,m.lcString)

LOCAL laString(1)
=ALINES(laString,m.lcString)


ln2=''

LOCAL lnI, lcOneLine

FOR lnI=1 TO ALEN(laString,1)
lcOneLine=laString[lnI]
select f
APPEND BLANK
REPLACE rr WITH CTOD(stod(SubStr(lcOneLine,78,8))), ;
tt WITH VAL(SubStr(lcOneLine,75,3)), ;
hh WITH VAL(SubStr(lcOneLine,86,2)), ;
qq WITH VAL(SubStr(lcOneLine,26,9)), ;
yy WITH SubStr(lcOneLine,35,20), ; ee WITH SubStr(lcOneLine,177,160), ;
........
sss with SubStr(lcOneLine,888,16)

ENDFOR
delete FILE('file.exp')
endif
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586936
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Forzyпопробовал, всё читается.
ЕСЛИ ВЫ РАБОТАЕТЕ С НЕСКОЛЬКИМИ КОДОВЫМИ СТРАНИЦАМИ
(для таблиц содовая страница определена в шапке)
VFP это позволяет
в config.fpw
CODEPAGE = AUTO
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32586953
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Forzy
COPY TO ('basa') TYPE FOX2X as 866

lcString=CPCONVERT(866,1251,m.lcString)

Вы создаёте таблицу с кодовой страницой 866
а пишите строку в кодеровке 1251
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32587003
Forzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если не перекодировать, текст нечитаем , поэтому делаю перекодировку. При этом выходной файл базы данных, полностью соответствует тому что надо получить. Вопрос в том, что может повлиять на изменение кодировки при работе экзешника? Файл конфигурации зашит в экзешник, кодовая страница там прописана 1251. Если прописать 866 то текст на сообщениях становится нечитабелен. Если прописать AUTO то тоже всё читается. Просто в какой-то момент времени при срабатывании программы, текст в базе становится нечитабелен....
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32587061
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, из приведенного кода этого не следует, но...
Не происходит ли так, что одну и ту же строчку 2 раза конвертят в 1251 из 866-го, первый раз потому что действительно надо, а второй - лишний?
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32587073
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ForzyВопрос в том, что может повлиять на изменение кодировки при работе экзешника?

-) строка CODEPAGE в файле config.fpw определяет:
а) Текущую кодовую страницу среды FoxPro
б) будет ли вообще выполняться автоматическая трансляция разных кодовых страниц

Ни в коем случае нельзя ставить CODEPAGE=AUTO - это означает, что надо установить кодовую страницу FoxPro такую же как и кодовая страница ОС. У Вас есть уверенность, что Windows клиента всегда будет иметь 1251?

-) Явное указание кодовой страницы в различных командах FoxPro определяет как именно транслировать данные.

-) Для версий до VFP5 включительно требуется еще файл foxpro.int Однако, я вижу, что у тебя более старшая версия, так что этот файл не нужен.

ForzyПросто в какой-то момент времени при срабатывании программы, текст в базе становится нечитабелен....

Если файл Config.fpw включен внутрь EXE и при запуске EXE не используется ключ -С для явного указания файла конфигурации. При этом сам EXE никак не модифицировался, то скорее всего проблема именно в исходном тесктовом файле.

Если сам EXE не менялся
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32587098
Forzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще одна причина - это возможная "потеря" переменных. Но это надо смотреть код. Отобрази начало полученного файла, что-то вроде:

lcString=FileToStr('file.txt')
lcString=CPCONVERT(866,1251,m.lcString)
MessageBox(LEFT(m.lcString,50))

Насколько читаемый текст получится. И будет ли он содержать именно файл, а не что-то другое.

***************************************************
пороверил, текст выводится в читабельном виде и то что нужно..
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32587114
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор-) Для версий до VFP5 включительно требуется еще файл foxpro.int Однако, я вижу, что у тебя более старшая версия, так что этот файл не нужен.


Проверено на личном опыте
НЕОБХОДИМОСТЬ FOXPRO.INT (В ТАКИХ СЛУЧАЯХ ПОМОГАЕТ ОЧЕНЬ ХОРОШО)
И РАБОТАЕТ ДО СИХ ПОР fvp8

CODEPAGE=AUTO
ПОЗВОЛЯЕТ БЕЗ ПЕРЕКОДИРОВКИ ВСТАВЛЯТЬ ЗАПИСИ
ИЗ 866 В 1251 И НА ОБОРОТ
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32587142
Forzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что прописывается в файле .INT ?
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32587246
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_tПроверено на личном опыте
НЕОБХОДИМОСТЬ FOXPRO.INT (В ТАКИХ СЛУЧАЯХ ПОМОГАЕТ ОЧЕНЬ ХОРОШО)
И РАБОТАЕТ ДО СИХ ПОР fvp8

Павел, начиная с VFP6 этот файл нужен только при работе с COM-серверами. В очень специфических ситуациях. Для штатной работы из среды FoxPro в нем нет необходимости

Pavel_tCODEPAGE=AUTO
ПОЗВОЛЯЕТ БЕЗ ПЕРЕКОДИРОВКИ ВСТАВЛЯТЬ ЗАПИСИ
ИЗ 866 В 1251 И НА ОБОРОТ

Вы опять-таки невнимательны. Строка

CODEPAGE=AUTO

означает, что в качестве текущей кодовой страницы FoxPro будет установлена кодовая страница Windows. Да, в большинстве случаев Windows и сама имеет кодовую страницу 1251. Но ведь полно и не локализованных систем. Т.е. у них кодовая страница 1252. И попав на такую систему Вы очень удивитесь полученным результатам.

Кроме установки текущей кодовой страницы, строка CODEPAGE=... включает автоматическую трансляцию из разных известных кодовых страниц. Впрочем, кажется с версии VFP6 эта автоматическая трансляция осуществляется и без указания CODEPAGE=...

Если речь идет о таблицах, то признак кодовой страницы хранится в их заголовке. Т.е. FoxPro и так знает, в какой кодовой странице находится информация в разных файлах DBF. Поэтому бе проблем идет конвертация из таблицы с кодовой страницей 1251 в таблицу с кодовой страницей 866. НО! если текущей кодовой страницей является 1251. Имея настройку CODEPAGE=AUTO Вы этого гарантировать не можете.

И вообще, почитайте здесь

http://www.foxclub.ru/kb/index.php?sid=29191&aktion=artikel&rubrik=001001&id=10&lang=ru

ForzyЧто прописывается в файле .INT ?

Это специальный служебный файл, который поставлялся вместе с FoxPro и распологался в его корневой директории. Его необходимо было класть рядом с EXE. Включать внутрь EXE недопустимо. Начиная с версии VFP6 не используется (точнее, используется в очень специфических ситуациях) и не поставляется. Если он тем не менее необходим, то его следует скачивать с сайта MicroSoft
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32587385
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Павел, начиная с VFP6 этот файл нужен только при работе с COM-серверами. В очень специфических ситуациях. Для штатной работы из среды FoxPro в нем нет необходимости




Возможно я и не внимательный но!!!

ОС Win2000
VFP8
**********************
созданы 2 таблицы t1 - 866
t2 - 1251
структуры одинаковы поле техт character(10)
добавлено по записи "Проверка"
**************************
текст программы
USE t2.dbf
BROWSE
append FROM t1
BROWSE
*************************
создан ехе
при запуске без .INT иероглифы
с .INT все нормально
CONFIG.FPW нет вообще
Вывод напрашивается
Это помогает и сейчас
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32587451
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_t
У меня под рукой сейчас нет VFP8, но откуда ты взял в нем файл FOXPRO.INT? Разве он с ним поставляется?

Что у тебя возврашает функция CPCURRENT() без параметра и с параметрами 1 и 2?
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32587582
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ Pavel_t
FOXPRO.INT? Разве он с ним поставляется?

Что у тебя возврашает функция CPCURRENT() без параметра и с параметрами 1 и 2?

Код: plaintext
1.
2.
3.
4.
5.
6.
FOXPRO.INT Я тащу во всех проектах ещё с VFP5
И всегда CODEPAGE = AUTO 
работает всегда 

CPCURRENT()    1252 
CPCURRENT( 1 )   1251 
CPCURRENT( 2 )   866 
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32587646
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. ты берешь файл из старой версии FoxPro и утверждаешь что это есть правильно?

Лично я не взял бы на себя смелость утверждать, что это будет работать ВСЕГДА. Если особенность не документирована, это значит, что за последствия использования этой особенности ты отвечаешь сам и не будешь иметь претензий, если что-то вдруг "завалится".

Штатным способом работы с разными кодовыми страницами является использование CODEPAGE=1251 в файле Config.fpw

Да, еще ты не пробовал по той же методике (с FoxPro.int) поработать с мемо-полями? Получилось?
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32588720
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ Павел, начиная с VFP6 этот файл нужен только при работе с COM-серверами. В очень специфических ситуациях. Для штатной работы из среды FoxPro в нем нет необходимости

ВладимирМТ.е. ты берешь файл из старой версии FoxPro и утверждаешь что это есть правильно?


Интересно где Вы его берёте Для работы с COM-серверами. В очень специфических ситуациях.?

ВладимирМДа, еще ты не пробовал по той же методике (с FoxPro.int) поработать с мемо-полями? Получилось?

получилось и получалось!


Код: plaintext
1.
2.
3.
4.
Откройте нортоне  FoxPro.int  
там для различных языков приводится соответствие 
Dos -  windows кодовых страниц ,что там может изменится от версии к версии?
Я не принуждаю VFP Использовать FoxPro.int   
я его кладу рядом с ЕХЕ а fox сам решает использовать его или нет
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32588938
Forzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возвращаясь "к нашим баранам", дело в следующем, кодовая страница меняется после отработки некой программы, создающей текстовый файл. Программа не на фоксе. Если запускать мою прогу до выполнения этой программы, то всё работает хорошо, если после, то текст не читается в полях. Чё за фигня? Как программа может так коренным образом поменять кодовую страницу?
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32588975
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всётаки советую положить FoxPro.int (рядом с ехе или туда куда советует Гейтс) и не забыть про Config.fpw - есть вероятность что поможет и большая

ЗДЕСЬ УПОМИНАНИЕ О FoxPro.int B vfp8

MSDN



СКАЧАТЬ FoxPro.int
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32589028
Forzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде как заработало! сделал всё что можно, и .INT положил к .EXE и cpzero включил в обработку подготавливаемого файла при проверке на несовпадение кодовой страницы, в config.fpw кодовую страницу указал....
...
Рейтинг: 0 / 0
Почему кодовая страница меняется сама?
    #32609962
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_tЗДЕСЬ УПОМИНАНИЕ О FoxPro.int B vfp8
Далеко не все статьи HELP соответсвуют действительности. В частности, функция GetCP() прекрасно рабоатет и БЕЗ файла foxpro.int

Pavel_t MSDN

Вы обратили внимание на то, для какой именно версии FoxPro эта статья была написана?

Microsoft Visual FoxPro for Windows 3.0

Pavel_t СКАЧАТЬ FoxPro.int

По хорошему, здесь надо было дать ссылку не на сам файл, а на статью, в которой приволится ПРИЧИНА его использования

http://support.microsoft.com/default.aspx?scid=kb;en-us;191685&pr=chs&t1=7d&fr=0&a=t&t=b&s=f&

Про COM-сервер - это опечатка :) я как раз и имел в виду эту статью.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Почему кодовая страница меняется сама?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]