FoxPro Club Неправильне відображення окремих символів або розбіжність кодових сторінок
Досить часто у конференції постає питання, що окремі літери української мови відображаються невірно. Нижче наведено 2 рядки символів. Перша – це українські літери, а друга – це те, як вони відображаються у програмі.
Проблема ця має назву "несупадання кодових сторінок". Перший рядок у наведеному прикладі написаний у кодовій сторінці 1251(Win Rus), а другий отриманий конвертацією її в кодову сторінку 1252(Win USA). Практично кожен програміст FoxPro пише не для англомовних користувачів рано чи пізно, але обов'язково з нею стикається.
Причини виникнення цієї помилки можна розділити на кілька груп:
I - Немає будь-яких службових файлів або бібліотек II - Не зроблено потрібне налаштування середовища FoxPro III - У використаних файлах вказана не та або взагалі не вказана кодова сторінка IV - Помилки налаштування операційної системи
Спробую розібрати причини цієї помилки по порядку.
I - Немає будь-яких службових файлів або бібліотек
До версії VFP5 включно разом із готовим EXE-файлом клентам необхідно було ще поставляти спеціальний службовий файл FOXPRO.INT
Починаючи з версії VFP6, потреба в цьому файлі відпала.
Можна зітхнути з полегшенням та висловити окрему подяку MicroSoft взагалі та розробникам VFP зокрема. Зупиняє мене тільки те, що було випущено 7 версію FoxPro і з чуток аналогічні проблеми з'явилися при створенні дистрибутивів. Оскільки у мене немає 7 версії, то й не поширюватиму чутки, почекаємо сервіс паки та коментарі тих у кого він є.
II - Не зроблено потрібне налаштування середовища FoxPro
Ця проблема пов'язана з логікою роботи FoxPro щодо кодових сторінок. Справа в тому, що за умовчанням,FoxPro не підтримує автоматичну трансляцію символьних та мемо-полів. Більше того, не підтримується трансляція та відкомпільовані текстові файли (FXP, TXT).
Якщо ваш проект був створений у системі з тією ж кодовою сторінкою, що й у клієнта, то ви не помітите різниці. Оскільки якщо автоматична трансляція у FoxPro не була включена, FoxPro буде припускати, що всі дані слід відображати в поточній кодовій сторінці системи. Винятком у цьому сенсі є VFP7 – тут різниця буде помітною (з MicroSoft – не скучиш).
Включити автоматичну трансляцію символьних даних можна одним способом. Для цього потрібно створити звичайний текстовий файл з ім'ям CONFIG.FPW і вписати до нього наступний рядок
У посібнику з FoxPro рекомендують писати рядок
Однак, проблема полягає в тому, що якщо ваш проект передбачає створення нових файлів, то при вказівці ключового слова AUTO замість номера кодової сторінки всі ці нові файли будуть створюватися в поточній кодовій сторінці системи. А вона може бути відмінна від 1251 року.
Строго кажучи, як уже було сказано, наявність цієї настройки в більшості випадків не є обов'язковою. Однак, її відсутність буде помітно якщо:
-) Ви працюєте зі старими DOS таблицями в 866 кодовій сторінці -) У клієнтів у системі поточної кодової сторінкою не є 1251 -) Ви працюєте у VFP7
Зупинюся трохи на останньому пункті. Якщо до виходу версії 7 передбачалося, що при відсутності явної вказівки на автоматичну трансляцію кодових сторінок слід брати кодову сторінку системи, то в відкомпілюваному EXE файлі версії VFP7 очевидно передбачається, що треба брати кодову сторінку 1252 незалежно від кодової сторінки системи.
На відміну від файлуFOXPRO.INT, файл CONFIG.FPW можна включати до проекту і не поставляти окремо від готового EXE. Варто лише пам'ятати, що налаштування конфігураційного файлу встановлюються один раз при запуску середовища FoxPro. Це означає, що після запуску середовища FoxPro жодні зміни у файлі конфігурації не призведуть до зміни налаштувань середовища FoxPro. Потрібно буде перезавантажити FoxPro.
Підключити конфігураційний файл на етапі розробки можна таким чином:
"C:\Program Files\Microsoft Visual Studio\Vfp98\VFP6.EXE" -C"C:\MyProjects\Project1\config.fpw"
Ключ "-C" вказує, що за ним стоїть ім'я файлу конфігурації, який слід використовувати при запуску FoxPro. Строго кажучи, в даному випадку ім'я конфігураційного файлу може бути абсолютно будь-яким, але краще дотримуватися прийнятих найменувань. Ідеальним варіантом є створення ярлика на робочому столі для запуску свого проекту.
Для готового EXE-файлу досить просто покласти файл CONFIG.FPW в ту ж директорію, де знаходиться сам EXE-файл.
Для найбільш допитливих:
-)Можна зробити налаштування кодової сторінки та в системному реєстрі Windows. Для цього слід в
Створити додатковий рядковий параметр CodePage і надати йому значення 1251.
-)Скасувати автоконвертацію деяких полів таблиці можна за допомогою налаштування SET NOCPTRANS. Це має сенс для полів типу Binary, де конвертація все одно нічого не дасть.
III - У використаних файлах вказана не та чи взагалі не вказана кодова сторінка
Причини встановлення неправильної кодової сторінки може бути 2:
-) Під час створення файлу не було файлу конфігурації CONFIG.FPW з рядком CODEPAGE=1251. У цьому випадку нові файли будуть створені в кодовій сторінці операційної системи. -) Файли,використані у проекті були скопійовані з інших джерел. Наприклад, усі файли стандартних прикладів Solution.pjx та TasTrade.pjx створені в кодовій сторінці 1252.
Переглянути кодові сторінки всіх файлів включених у проект можна через пункт головного меню Project->Project Info->закладка Files
Змінити кодову сторінку текстових файлів (TXT, PRG, QPR) можна там же, клацнувши правою клавішею миші на потрібному файлі і вибравши в меню пункт CodePage.
Інші файли, що входять до проекту (форми, класи, звіти), за своєю суттю є звичайними DBF-таблицями. Для зміни їх кодових сторінок разом із FoxPro поставляється спеціальна програма CPZERO.PRG. Ця програма розташована в (коренева директорія FoxPro) \ TOOLS \ CPZERO \
Для зміни кодових сторінок слід дати команду DO CPZERO.PRG WITH "MyForm.SCX",1251 DO CPZERO.PRG WITH "MyClass.VCX",1251 DO CPZERO.PRG WITH "MyMenu.MNX" ,1251 DO CPZERO.PRG WITH "MyProject.PJX",1251 DO CPZERO.PRG WITH "MyBase.DBC",1251
В даному випадку потрібно вказувати розширення файлів.
Окремо слід сказати про підтримку таблиць, створених у FoxPro for DOS. У ті далекі часи (уже 5 років тому) кодова сторінка або взагалі не використовувалася або використовувалася 866 кодова сторінка.
У файлах створених у FPD2.0 за промовчанням кодова сторінка взагалі не вказувалася. Для таких файлів слід встановлювати кодову сторінку 866. На роботу старих DOS-програм це ніяк не вплине, але VFP інформація буде відображатися як треба.
Якщо у вашому проекті використовуються таблиці в 866 кодовій сторінці, наявність файлу конфігурації CONFIG.FPW з рядком CODEPAGE=1251 стає просто необхідним.
Для перевірки поточної кодової сторінки DBF-таблиць можна скористатисяфункцією CPDBF()
IV - Помилки налаштування операційної системи
Ну ось, дійшли до улюблених усіма програмістами помилок налаштувань операційної системи. Як правило, про них згадують або в першу або останню чергу. Це помилки пов'язані з тим, що операційна система в деяких випадках вважає, що окремі об'єкти проекту або весь проект написано в кодовій сторінці 1252.
Ця помилка характерна для відображення даних у ActiveX компонентах, якщо проект був створений у Win9x, а готовий EXE запускається серед WinNT, WinXP або Win2000