Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Т.е. ты берешь файл из старой версии FoxPro и утверждаешь что это есть правильно? Лично я не взял бы на себя смелость утверждать, что это будет работать ВСЕГДА. Если особенность не документирована, это значит, что за последствия использования этой особенности ты отвечаешь сам и не будешь иметь претензий, если что-то вдруг "завалится". Штатным способом работы с разными кодовыми страницами является использование CODEPAGE=1251 в файле Config.fpw Да, еще ты не пробовал по той же методике (с FoxPro.int) поработать с мемо-полями? Получилось? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2004, 16:48 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Павел, начиная с VFP6 этот файл нужен только при работе с COM-серверами. В очень специфических ситуациях. Для штатной работы из среды FoxPro в нем нет необходимости ВладимирМТ.е. ты берешь файл из старой версии FoxPro и утверждаешь что это есть правильно? Интересно где Вы его берёте Для работы с COM-серверами. В очень специфических ситуациях.? ВладимирМДа, еще ты не пробовал по той же методике (с FoxPro.int) поработать с мемо-полями? Получилось? получилось и получалось! Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2004, 08:50 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Возвращаясь "к нашим баранам", дело в следующем, кодовая страница меняется после отработки некой программы, создающей текстовый файл. Программа не на фоксе. Если запускать мою прогу до выполнения этой программы, то всё работает хорошо, если после, то текст не читается в полях. Чё за фигня? Как программа может так коренным образом поменять кодовую страницу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2004, 10:56 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Всётаки советую положить FoxPro.int (рядом с ехе или туда куда советует Гейтс) и не забыть про Config.fpw - есть вероятность что поможет и большая ЗДЕСЬ УПОМИНАНИЕ О FoxPro.int B vfp8 MSDN СКАЧАТЬ FoxPro.int ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2004, 11:08 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
Вроде как заработало! сделал всё что можно, и .INT положил к .EXE и cpzero включил в обработку подготавливаемого файла при проверке на несовпадение кодовой страницы, в config.fpw кодовую страницу указал.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2004, 11:28 |
|
||
|
Почему кодовая страница меняется сама?
|
|||
|---|---|---|---|
|
#18+
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-сервер - это опечатка :) я как раз и имел в виду эту статью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 10:23 |
|
||
|
|

start [/forum/topic.php?all=1&fid=41&tid=1596137]: |
0ms |
get settings: |
7ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 395ms |

| 0 / 0 |
