Виправлення у Firebird 2.5 щодо кодування у рядку підключення
Автор: Adriano dos Santos Fernandes [email protected]
Дата: 2008-12-15
До FB 2.5 імена файлів, що використовуються в рядку з’єднання, завжди передаються від клієнта до
сервера без жодного перетворення. На сервері ці імена файлів також використовуються з функціями OS API без
жодного перетворення. Це створює ситуацію, коли імена файлів із не-ASCII символами погано
взаємодіють, коли клієнт і сервер працюють на різних ОС або навіть на одній ОС із різними
кодовими сторінками.
Цю проблему вирішено у FB 2.5 наступним чином:
Ім’я файлу за замовчуванням вважається таким, що перебуває в кодовій сторінці ОС.
Вводиться новий DPB, названий isc_dpb_utf8.filename. Його призначення - змінити наведене вище правило, тож FB
має вважати передане ім’я файлу таким, що перебуває у UTF-8.
Якщо клієнт v2.5 (або новіший) спілкується з віддаленим сервером старішим за v2.5, і
використовувався isc_dpb_utf8.filename, клієнт перетворює ім’я файлу з UTF-8 у кодову сторінку
клієнта та передає це ім’я файлу серверу. Клієнт видаляє DPB isc_dpb_utf8.filename.
Це гарантує зворотну сумісність, коли люди використовують однакову кодову сторінку на клієнті та
серверній ОС.
Якщо клієнт v2.5 (або новіший) спілкується із сервером v2.5 (або новішим), і
isc_dpb_utf8.filename не використовувався, клієнт перетворює ім’я файлу з кодової сторінки ОС у
UTF-8 та вставляє DPB isc_dpb_utf8.filename. Якщо isc_dpb_utf8.filename використовувався, клієнт просто
передає оригінальне ім’я файлу всередині DPB серверу. Отже, клієнт завжди передає серверу
ім’я файлу у UTF-8 та DPB isc_dpb_utf8.filename.
Ім’я файлу, отримане на сервері, підлягає тим самим правилам, що й вище. Але зауважте, що клієнт v2.5
може автоматично перетворювати ім’я файлу та вставляти DPB. Клієнти старіші за v2.5 цього не роблять,
тож отримані імена файлів вважатимуться такими, що перебувають у кодовій сторінці сервера. Ми знову гарантуємо
зворотну сумісність, коли кодова сторінка клієнта та сервера однакова.
Кодова сторінка ОС та UTF-8 можуть бути не найкращим вибором для імен файлів. Наприклад, якщо у вас є
скрипт ISQL (або іншого інструмента), і цей скрипт використовує інший набір символів з’єднання. Ви не могли б
коректно редагувати скрипт (або будь-який файл), використовуючи кілька наборів символів (кодових сторінок). Тож тепер ви можете
кодувати будь-який символ Unicode як ASCII-символи у імені файлу в рядку з’єднання. Це
досягається за допомогою символу #. Він є префіксом для номера кодової точки Unicode (у шістнадцятковому
форматі, як позначення U+XXXX). Ви маєте записувати це так: #XXXX, де X - це 0-9, a-f, A-F.
Якщо ви хочете використати буквальний символ #, ви можете використати ## або #0023 (номер кодової точки для нього).
Цей символ інтерпретується з цією новою семантикою на сервері, навіть якщо клієнт старіший
за v2.5.
Кодова сторінка ОС, що використовується для перетворень, така:
- Windows: кодова сторінка Windows ANSI
- Інші: UTF-8
Оновлено для 2.5 Beta 2: 2008-07-11
Ці правила тепер також дійсні для рядкових елементів DPB.