Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Сабж такой.... Прога конвертит текстовый файл в DBF, кодовая страница прописана в config.fpw включённый в ехе, в какой-то момент времени при конвертации текст становится нечитабелен, хотя до этого на той-же машине, не перегружаясь, всё работало как надо.... В чём грабли??? Вопрос жизненно важный! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 08:43 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
А текстовый файл в какой кодировке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 09:03 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
кодовая страница 1251 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 09:10 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
нет, ошибся, текст DOS. нужно чтоб и в базе тоже был текст DOS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 09:25 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Forzyв какой-то момент времени при конвертации текст становится нечитабелен, хотя до этого на той-же машине, не перегружаясь, всё работало как надо.... -) Как именно ты читаешь этот текстовый файл -) Как именно создается этот текстовый файл Forzyнет, ошибся, текст DOS. нужно чтоб и в базе тоже был текст DOS -) Какая версия FoxPro -) Если текст DOS, то это кодовая страница 866. Однако для версий Visual FoxPro если не хочешь кучи проблем установи CODEPAGE=1251 для среды FoxPro -) Есть команды конвертации кодовой страницы, но необходимо знать как именно происходит запись/чтение в тектовый файл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 09:52 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Текстовый файл беру готовый далее его в массив, из массива в базу. 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)), ..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 10:02 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Базу создаю так 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 10:12 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
ForzyТекстовый файл беру готовый Вот в этом-то и проблема. Дело в том, что в текстовом файле в принципе нет никакого признака, определяющего в какой именно кодовой странице он создан. Поэтому, когда ты делаешь CPCONVERT(866,1251,m.lcString) ты только предполагаешь , что этот текстовый файл создан именно в кодовой странице 866. Но фактически, проверить это никак невозможно. Если тебе подсунули текстовый файл созданный в другой кодировке (например в 1251), то конвертация через CPCONVERT() и приведет к таким непредсказуемым результатам. Пробовал просмотреть этот текстовый файл блокнотом? Если нормальный текст, значит этот файл в кодовой странице 1251, а не 866 как ожидалось. PS: построчный разбор текстового файла - это очень медленная операция. Лучше использовать APPEND FROM (если это возможно). Пусть даже разбивка по полям будет не очень точная. Потом можно подкорректировать разбивку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 11:29 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
попробовал, в блокноте текст нечитаем. 866 значит кодировка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 11:45 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Forzyпопробовал, в блокноте текст нечитаем. 866 значит кодировка Нет. Это всего-лишь значит, что НЕ 1251, а какая именно - неизвестно. Просто в среде FoxPro пробовал открыть этот текстовый файл командой: MODIFY COMMAND MyFile.txt AS 866 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 11:52 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
попробовал, всё читается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 11:57 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
В FoxPro текущая кодовая страница устанавливается в момент запуска среды FoxPro и в процессе работы уже не может быть изменена. Наиболее вероятная причина - это все-таки некорректноая устновка CODEPAGE в файле Config.FPW. Там должно быть CODEPAGE=1251 Этот факт проверяется следующим образом SYS(2019) - путь доступа к файлу конфигурации CPCURRENT() - без параметра - текущая кодовая страница FoxPro Еще одна причина - это возможная "потеря" переменных. Но это надо смотреть код. Отобрази начало полученного файла, что-то вроде: Код: plaintext 1. 2. Насколько читаемый текст получится. И будет ли он содержать именно файл, а не что-то другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 12:12 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 12:33 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Forzyпопробовал, всё читается. ЕСЛИ ВЫ РАБОТАЕТЕ С НЕСКОЛЬКИМИ КОДОВЫМИ СТРАНИЦАМИ (для таблиц содовая страница определена в шапке) VFP это позволяет в config.fpw CODEPAGE = AUTO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 12:45 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Forzy COPY TO ('basa') TYPE FOX2X as 866 lcString=CPCONVERT(866,1251,m.lcString) Вы создаёте таблицу с кодовой страницой 866 а пишите строку в кодеровке 1251 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 12:51 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
если не перекодировать, текст нечитаем , поэтому делаю перекодировку. При этом выходной файл базы данных, полностью соответствует тому что надо получить. Вопрос в том, что может повлиять на изменение кодировки при работе экзешника? Файл конфигурации зашит в экзешник, кодовая страница там прописана 1251. Если прописать 866 то текст на сообщениях становится нечитабелен. Если прописать AUTO то тоже всё читается. Просто в какой-то момент времени при срабатывании программы, текст в базе становится нечитабелен.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 13:14 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Конечно, из приведенного кода этого не следует, но... Не происходит ли так, что одну и ту же строчку 2 раза конвертят в 1251 из 866-го, первый раз потому что действительно надо, а второй - лишний? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 13:34 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
ForzyВопрос в том, что может повлиять на изменение кодировки при работе экзешника? -) строка CODEPAGE в файле config.fpw определяет: а) Текущую кодовую страницу среды FoxPro б) будет ли вообще выполняться автоматическая трансляция разных кодовых страниц Ни в коем случае нельзя ставить CODEPAGE=AUTO - это означает, что надо установить кодовую страницу FoxPro такую же как и кодовая страница ОС. У Вас есть уверенность, что Windows клиента всегда будет иметь 1251? -) Явное указание кодовой страницы в различных командах FoxPro определяет как именно транслировать данные. -) Для версий до VFP5 включительно требуется еще файл foxpro.int Однако, я вижу, что у тебя более старшая версия, так что этот файл не нужен. ForzyПросто в какой-то момент времени при срабатывании программы, текст в базе становится нечитабелен.... Если файл Config.fpw включен внутрь EXE и при запуске EXE не используется ключ -С для явного указания файла конфигурации. При этом сам EXE никак не модифицировался, то скорее всего проблема именно в исходном тесктовом файле. Если сам EXE не менялся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 13:38 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Еще одна причина - это возможная "потеря" переменных. Но это надо смотреть код. Отобрази начало полученного файла, что-то вроде: lcString=FileToStr('file.txt') lcString=CPCONVERT(866,1251,m.lcString) MessageBox(LEFT(m.lcString,50)) Насколько читаемый текст получится. И будет ли он содержать именно файл, а не что-то другое. *************************************************** пороверил, текст выводится в читабельном виде и то что нужно.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 13:46 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
автор-) Для версий до VFP5 включительно требуется еще файл foxpro.int Однако, я вижу, что у тебя более старшая версия, так что этот файл не нужен. Проверено на личном опыте НЕОБХОДИМОСТЬ FOXPRO.INT (В ТАКИХ СЛУЧАЯХ ПОМОГАЕТ ОЧЕНЬ ХОРОШО) И РАБОТАЕТ ДО СИХ ПОР fvp8 CODEPAGE=AUTO ПОЗВОЛЯЕТ БЕЗ ПЕРЕКОДИРОВКИ ВСТАВЛЯТЬ ЗАПИСИ ИЗ 866 В 1251 И НА ОБОРОТ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 13:52 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Что прописывается в файле .INT ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 14:00 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 14:33 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Павел, начиная с VFP6 этот файл нужен только при работе с COM-серверами. В очень специфических ситуациях. Для штатной работы из среды FoxPro в нем нет необходимости Возможно я и не внимательный но!!! ОС Win2000 VFP8 ********************** созданы 2 таблицы t1 - 866 t2 - 1251 структуры одинаковы поле техт character(10) добавлено по записи "Проверка" ************************** текст программы USE t2.dbf BROWSE append FROM t1 BROWSE ************************* создан ехе при запуске без .INT иероглифы с .INT все нормально CONFIG.FPW нет вообще Вывод напрашивается Это помогает и сейчас ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 15:21 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Pavel_t У меня под рукой сейчас нет VFP8, но откуда ты взял в нем файл FOXPRO.INT? Разве он с ним поставляется? Что у тебя возврашает функция CPCURRENT() без параметра и с параметрами 1 и 2? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 15:44 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Pavel_t FOXPRO.INT? Разве он с ним поставляется? Что у тебя возврашает функция CPCURRENT() без параметра и с параметрами 1 и 2? Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 16:28 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32587114&tid=1596137]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 401ms |

| 0 / 0 |
