powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Почему кодовая страница меняется сама?
25 сообщений из 31, страница 1 из 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
25 сообщений из 31, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Почему кодовая страница меняется сама?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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