Кодовые страницы Firebird и InterBase
Работа с кодовыми страницами Firebird и InterBase
В IBProvider, начиная с версии 3.0.0.6327, реализован принципиально новый механизм работы с кодовыми страницами. В новом драйвере доступно 49 кодовых страниц Firebird и InterBase. При помощи таблиц и алгоритмов перекодировки, текстовые колонки, BLOB-поля и массивы конвертируются провайдером в формат UCS2 (двухбайтный юникод), c которым работает Firebird и InterBase. При этом учитывается кодовая страница подключения к базе данных.
Наряду с текстовыми кодовыми страницами, IBProvider обеспечивает поддержку кодовой страницы бинарных данных — OCTETS.
Схема работы с кодовыми страницами представлена на картинке:
1. Кодовая страница базы данных и кодировка текстовой колонки в InterBase и Firebird.
При создании базы указывается кодовая страница текстовых данных ПО УМОЛЧАНИЮ. Выбранная кодовая страница будет использоваться для всех текстовых данных, хранящихся в БД. При необходимости, можно указать кодировку для отдельных колонок, массивов или BLOB-полей, которая может отличаться от кодовой страницы базы данных.
Если кодировка текстовой колонки задана, то будет использоваться она, а кодовая страница БД будет проигнорирована.
2. Кодовая страница NONE
Если кодовая страницы базы данных не задана и кодовая страница текстовой колонки не определена, то будет использована кодировка NONE.
Для работы с этой кодировкой в IBProvider определено свойство ctype_none, позволяющее задать кодовую страницу для конвертирования текстовых данных в кодировке NONE.
Если свойство ctype_none не задано, то по умолчанию для NONE будет использоваться перекодировщик ASCII:
- Коды символов до 127 включительно будут преобразованы в соответствующие символы.
- Коды символов свыше 127 будут считаться ошибочными и для них будет сгенерировано исключение.
На рисунке под цифрой 2 показано преобразование текстовых типов Firebird и InterBase в соответствующие типы OLE DB и ADO.
3. Кодовая страница OCTETS и бинарные данные
Кодировка OCTETS предназначена для хранения в текстовых колонках бинарных данных. При обнаружении данной кодовой страницы IBProvider не будет использовать процессор кодировок, а типы данных OLE DB и ADO будут выставлены в соответствующие бинарные эквиваленты CHAR, VARCHAR и BLOB (см. обозначение на рисунке под цифрой 3).
4-6. Текстовые кодовые страницы
Для кодовых страниц, отличных от NONE и OCTETS используется процессор кодировок. Его упрощенная схема изображена на рисунке под цифрами 4, 5 и 6.
Кодировка хранения — кодовая страница текстовой колонки или базы данных.
Кодировка подключения — определяется свойством инициализаии ctype. Если оно задано, то данные считываются и записываются в этой кодировке, а кодировка хранения игнорируется.
Клиентская кодировка — кодовая страница текстовых данных, с которой работает клиент. Клиентская кодировка задается свойством ctype_user. К примеру, данные в БД, могут храниться в кодировке WIN1251, а к клиенту поступать в UTF-8. При записи текстовых данных в БД, производится обратное преобразование в кодировку хранения или в кодировку подключения.
Если ctype=NONE, то сервер игнорирует кодовую страницу подключения и использует кодировку хранения.
Если ctype_user=NONE, то провайдер игнорирует кодовую страницу клиента и предоставляет данные пользователю в кодировке хранения или, если ctype!=NONE, в кодировке подключения.
Для кодовых страниц NONE и OCTETS свойства ctype_user и ctype игнорируются.
Динамические клиентские кодировки (кодовые страницы клиента).
Допустимыми значениями ctype_user являются любое имя кодовой страницы, поддерживаемой провайдером и специальные имена динамически определяемых кодовых страниц — «ACP» и «OCP»
ACP — провайдер вызывает GetACP() и конвертирует «ACP» в «WINDOWS-xxx», где «xxx» идентификатор системной кодовой страницы ANSI.
OCP — провайдер вызывает GetOEMCP() и конвертирует «OEM» в «DOS-xxx», где «xxx» идентификатор системной кодовой страницы OEM.
Если не удалось конвертировать имя кодовой страницы или она не поддерживается сервером — провайдер генерирует ошибку.
7. Режим Unicode
В провайдере определено свойство unicode_mode, которое определяет формат публикации текстовых данных.
Если unicode_mode = true, то используются типы данных Unicode DBTYPE_WSTR: WChar, VarWChar и LongVarWChar.
Если unicode_mode = false, то используются простые типы DBTYPE_STR: Char, VarChar и LongVarChar.
Размер текстовых колонок в Firebird 2.x
IBProvider контролирует размер текстовых колонок при работе с серверами Firebird 2 в режиме Unicode. Если длина загруженных данных превысит размер текстовой колонки, то будет сгенерировано исключение. Чтобы избежать проверки размера колонки, можно подключиться в обычном режиме с указанием Unicode_mode=false.
Псевдонимы кодовых страниц Firebird и InterBase
IBProvider позволяет указать кодовую страницу по её названию, по серверному псевдониму, а так же с использованием имен-псевдонимов, встроенных в провайдер. К примеру, кодовая страница WIN1251, может быть определена по своему названию WIN1251, по серверному псевдониму WIN_1251, а так же через псевдонимы IBProvider: WIN-1251 и WINDOWS-1251.
Обработка пустых имен кодовых страниц
Пустые значения свойств ctype, ctype_user и ctype_none замеяются на NONE.
Поддерживаемые кодировки IBProvider Professional v3
ID | Кодировка | Максимум байт на 1 символ |
Collation | Поддержкиваемые языки | Псевдонимы |
2 | ASCII | 1 | ASCII | English | ASCII7, USASCII |
56 | BIG_5 | 2 | BIG_5 | Chinese, Vietnamese, Korean | BIG5, DOS_950, WIN_950 |
50 | CYRL | 1 | CYRL | Russian | — |
50 | — | — | DB_RUS | Dbase Russian | — |
50 | — | — | PDOX_CYRL | Paradox Russian | — |
10 | DOS437 | 1 | DOS437 | English—USA | DOS_437 |
10 | — | — | DB_DEU437 | DBase German | — |
10 | — | — | DB_ESP437 | DBase Spanish | — |
10 | — | — | DB_FRA437 | DBase French | — |
10 | — | — | DB_FIN437 | DBase Finnish | — |
10 | — | — | DB_ITA437 | DBase Italian | — |
10 | — | — | DB_NLD437 | DBase Dutch | — |
10 | — | — | DB_SVE437 | DBase Swedish | — |
10 | — | — | DB_UK437 | DBase English—UK | — |
10 | — | — | DB_US437 | DBase English—USA | — |
10 | — | — | PDOX_ASCII | Paradox ASCII code page | — |
10 | — | — | PDOX_SWEDFIN | Paradox Swedish/Finnish code pages | — |
10 | — | — | PDOX_INTL | Paradox International English code page | — |
9 | DOS737 | 1 | DOS737 | Greek | DOS_737 |
15 | DOS775 | 1 | DOS775 | Baltic | DOS_775 |
11 | DOS850 | 1 | DOS850 | Latin I (no Euro symbol) | DOS_850 |
11 | — | — | DB_DEU850 | German | — |
11 | — | — | DB_ESP850 | Spanish | — |
11 | — | — | DB_FRA850 | French | — |
11 | — | — | DB_FRC850 | French—Canada | — |
11 | — | — | DB_ITA850 | Italian | — |
11 | — | — | DB_NLD850 | Dutch | — |
11 | — | — | DB_PTB850 | Portuguese—Brazil | — |
11 | — | — | DB_SVE850 | Swedish | — |
11 | — | — | DB_UK850 | English—UK | — |
11 | — | — | DB_US850 | English—USA | — |
45 | DOS852 | 1 | DOS852 | Latin II | DOS_852 |
45 | — | — | DB_CSY | DBase Czech | — |
45 | — | — | DB_PLK | DBase Polish | — |
45 | — | — | DB_SLO | DBase Slovakian | — |
45 | — | — | PDOX_PLK | Paradox Polish | — |
45 | — | — | PDOX_HUN | Paradox Hungarian | — |
45 | — | — | PDOX_SLO | Paradox Slovakian | — |
45 | — | — | PDOX_CSY | Paradox Czech | — |
46 | DOS857 | 1 | DOS857 | Turkish | DOS_857 |
46 | — | — | DB_TRK | DBase Turkish | — |
16 | DOS858 | 1 | DOS858 | Latin I + Euro symbol | DOS_858 |
13 | DOS860 | 1 | DOS860 | Portuguese | DOS_860 |
13 | — | — | DB_PTG860 | DBase Portuguese | — |
47 | DOS861 | 1 | DOS861 | Icelandic | DOS_861 |
47 | — | — | PDOX_ISL | Paradox Icelandic | — |
17 | DOS862 | 1 | DOS862 | Hebrew | DOS_862 |
14 | DOS863 | 1 | DOS863 | French—Canada | DOS_863 |
14 | — | — | DB_FRC863 | DBase French—Canada | — |
18 | DOS864 | 1 | DOS864 | Arabic | DOS_864 |
12 | DOS865 | 1 | DOS865 | Nordic | DOS_865 |
12 | — | — | DB_DAN865 | DBase Danish | — |
12 | — | — | DB_NOR865 | DBase Norwegian | — |
12 | — | — | PDOX_NORDAN4 | Paradox Norwegian & Danish | — |
48 | DOS866 | 1 | DOS866 | Russian | DOS_866 |
49 | DOS869 | 1 | DOS869 | Modern Greek | DOS_869 |
6 | EUCJ_0208 | 2 | EUCJ_0208 | EUC Japanese | EUCJ |
57 | GB_2312 | 2 | GB_2312 | Simplified Chinese (Hong Kong, PRC) | DOS_936, GB2312, WIN_936 |
21 | ISO8859_1 | 1 | ISO8859_1 | Latin 1 | ANSI, ISO88591, LATIN1 |
21 | — | — | FR_CA | French—Canada | — |
21 | — | — | DA_DA | Danish | — |
21 | — | — | DE_DE | German | — |
21 | — | — | ES_ES | Spanish | — |
21 | — | — | FI_FI | Finnish | — |
21 | — | — | FR_FR | French | — |
21 | — | — | IS_IS | Icelandic | — |
21 | — | — | IT_IT | Italian | — |
21 | — | — | NO_NO | Norwegian | — |
21 | — | — | DU_NL | Dutch | — |
21 | — | — | PT_PT | Portuguese | — |
21 | — | — | SV_SV | Swedish | — |
21 | — | — | EN_UK | English—UK | — |
21 | — | — | EN_US | English—USA | — |
22 | ISO8859_2 | 1 | ISO8859_2 |
Latin 2—Central European (Croatian, Czech, Hungarian, Polish, Romanian,Serbian, Slovakian, Slovenian) |
ISO-8859-2, ISO88592, LATIN2 |
22 | — | — | CS_CZ | Czech | — |
22 | — | — | ISO_HUN | Hungarian | — |
23 | ISO8859_3 | 1 | ISO8859_3 | Latin3—Southern European (Maltese, Esperanto) | ISO-8859-3, ISO88593, LATIN3 |
34 | ISO8859_4 | 1 | ISO8859_4 |
Latin 4—Northern European (Estonian, Latvian, Lithuanian, Greenlandic, Lappish) |
ISO-8859-4, ISO88594, LATIN4 |
35 | ISO8859_5 | 1 | ISO8859_5 | Cyrillic (Russian) | ISO-8859-5, ISO88595 |
36 | ISO8859_6 | 1 | ISO8859_6 | Arabic | ISO-8859-6, ISO88596 |
37 | ISO8859_7 | 1 | ISO8859_7 | Greek | ISO-8859-7, ISO88597 |
38 | ISO8859_8 | 1 | ISO8859_8 | Hebrew | ISO-8859-8, ISO88598 |
39 | ISO8859_9 | 1 | ISO8859_9 | Latin 5 | ISO-8859-9, ISO88599, LATIN5 |
40 | ISO8859_13 | 1 | ISO8859_13 | Latin 7—Baltic Rim | ISO-8859-13, ISO885913, LATIN7 |
44 | KSC_5601 | 2 | KSC_5601 | Korean (Unified Hangeul) | DOS_949, KSC5601, WIN_949 |
44 | — | — | KSC_DICTIONARY | Korean—dictionary order collation | — |
19 | NEXT | 1 | NEXT | NeXTSTEP encoding | — |
19 | — | — | NXT_US | English—USA | — |
19 | — | — | NXT_FRA | French | — |
19 | — | — | NXT_ITA | Italian | — |
19 | — | — | NXT_ESP | Spanish | — |
19 | — | — | NXT_DEU | German | — |
0 | NONE | 1 | NONE | Codepage-neutral. Uppercasing limited to ASCII codes 97—122 | — |
1 | OCTETS | 1 | OCTETS | Binary character | BINARY |
5 | SJIS_0208 | 2 | SJIS_0208 | Japanese | SJIS |
3 | UNICODE_FSS | 3 | UNICODE_FSS | UNICODE | SQL_TEXT, UTF-8, UTF8, UTF_FSS |
51 | WIN1250 | 1 | WIN1250 | ANSI—Central European | WIN_1250 |
51 | — | — | PXW_PLK | Polish | — |
51 | — | — | PXW_HUN | Hungarian | — |
51 | — | — | PXW_CSY | Czech | — |
51 | — | — | PXW_HUNDC | Hungarian—dictionary sort | — |
51 | — | — | PXW_SLOV | Slovakian | — |
52 | WIN1251 | 1 | WIN1251 | ANSI—Cyrillic | WIN_1251 |
52 | — | — | WIN1251_UA | Ukrainian | — |
52 | — | — | PXW_CYRL | Paradox Cyrillic (Russian) | — |
53 | WIN1252 | 1 | WIN1252 | ANSI—Latin I | WIN_1252 |
53 | — | — | PXW_SWEDFIN | Swedish & Finnish | — |
53 | — | — | PXW_NORDAN4 | Norwegian & Danish | — |
53 | — | — | PXW_INTL | English—International | — |
53 | — | — | PXW_INTL850 | Paradox Multi-lingual Latin I | — |
53 | — | — | PXW_SPAN | Paradox Spanish | — |
54 | WIN1253 | 1 | WIN1253 | ANSI Greek | WIN_1253 |
54 | — | — | PXW_GREEK | Paradox Greek | — |
55 | WIN1254 | 1 | WIN1254 | ANSI Turkish | WIN_1254 |
55 | — | — | PXW_TURK | Paradox Turkish | — |
58 | WIN1255 | 1 | WIN1255 | ANSI Hebrew | WIN_1255 |
59 | WIN1256 | 1 | WIN1256 | ANSI Arabic | WIN_1256 |
60 | WIN1257 | 1 | WIN1257 | ANSI Baltic | WIN_1257 | 61 | WIN1258 | 1 | WIN1258 | ANSI Vietnamese | WIN_1258 |
Поддержка внешних библиотек перекодирования данных
Помимо встроенных таблиц и алгоритмов перекодирования данных, IBProvider v3 может использовать внешнюю библиотеку с конверторами текстовых данных — ICU. Для этого нужно указать в строке подключения параметр icu_library=icuuc30.dll. У клиента должна быть библиотека с алгоритмами конвертора icuuc30.dll и ресурная — icudt30.dll. Библиотеки можно взять из поставки Firebird SQL Server.
Обратите внимание, что при использовании IBProvider 32bit нужно использовать 32-x битные ICU-библиотеки. При использовании IBProvider 64bit — 64-x битные ICU библиотеки. Использование ICU библиотеки из поставки Firebird 2.1 добавляет поддержку таких кодовых страниц как GBK и CP943C.
Полезные ссылки
Теги статьи: Firebird, InterBase, Firebird codepages, collations, InterBase charsets, Firebird encoding, Firebird oledb provider, UCS2 format, ODBC Firebird driver, character sets, ODBC InterBase driver
Поддерживаемые кодировки: ASCII, BIG_5, CYRL, DOS437, DOS737, DOS775, DOS850, DOS852, DOS857, DOS858, DOS860, DOS861, DOS862, DOS863, DOS866, DOS869, EUCJ_0208, GB_2312, ISO8859_1, ISO8859_2, ISO8859_3, ISO8859_4, ISO8859_5, ISO8859_6, ISO8859_7, ISO8859_8, ISO8859_9, ISO8859_13, KOI8R, KOI8U, KSC_5601, NEXT,NONE, SJIS_0208, TIS620, UNICODE_FSS, UTF8, WIN1250, WIN1251, WIN1252, WIN1253, WIN1254, WIN1255, WIN1256, WIN1257, WIN1258, OCTETS, GBK, CP943C