В IBProvider, начиная с версии 3.0.0.6327, реализован принципиально новый механизм работы с кодовыми страницами. В новом драйвере доступно 49 кодовых страниц Firebird и Interbase. При помощи таблиц и алгоритмов перекодировки, текстовые колонки, BLOB-поля и массивы конвертируются провайдером в формат UCS2 (двухбайтный юникод), c которым работает Firebird и Interbase. При этом учитывается кодовая страница подключения к базе данных.
Наряду с текстовыми кодовыми страницами, IBProvider обеспечивает поддержку кодовой страницы бинарных данных - OCTETS.
Схема работы с кодовыми страницами представлена на картинке:
При создании базы указывается кодовая страница текстовых данных ПО УМОЛЧАНИЮ. Выбранная кодовая страница будет использоваться для всех текстовых данных, хранящихся в БД. При необходимости, можно указать кодировку для отдельных колонок, массивов или BLOB-полей, которая может отличаться от кодовой страницы базы данных.
Если кодировка текстовой колонки задана, то будет использоваться она, а кодовая страница БД будет проигнорирована.
Если кодовая страницы базы данных не задана и кодовая страница текстовой колонки не определена, то будет использована кодировка NONE.
Для работы с этой кодировкой в IBProvider определено свойство ctype_none, позволяющее задать кодовую страницу для конвертирования текстовых данных в кодировке NONE. Если свойство ctype_none не задано, то по умолчанию для NONE будет использоваться перекодировщик ASCII:
Кодировка OCTETS предназначена для хранения в текстовых колонках бинарных данных. При обнаружении данной кодовой страницы IBProvider не будет использовать процессор кодировок, а типы данных OLE DB и ADO будут выставлены в соответствующие бинарные эквиваленты CHAR, VARCHAR и BLOB (см. обозначение на рисунке под цифрой 3).
Для кодовых страниц, отличных от 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.
Если не удалось конвертировать имя кодовой страницы или она не поддерживается сервером - провайдер генерирует ошибку.
В провайдере определено свойство unicode_mode, которое определяет формат публикации текстовых данных. Если unicode_mode = true, то используются типы данных Unicode DBTYPE_WSTR: WChar, VarWChar и LongVarWChar. Если unicode_mode = false, то используются простые типы DBTYPE_STR: Char, VarChar и LongVarChar.
IBProvider контролирует размер текстовых колонок при работе с серверами Firebird 2 в режиме Unicode. Если длина загруженных данных превысит размер текстовой колонки, то будет сгенерировано исключение. Чтобы избежать проверки размера колонки, можно подключиться в обычном режиме с указанием Unicode_mode=false.
IBProvider позволяет указать кодовую страницу по её названию, по серверному псевдониму, а так же с использованием имен-псевдонимов, встроенных в провайдер. К примеру, кодовая страница WIN1251, может быть определена по своему названию WIN1251, по серверному псевдониму WIN_1251, а так же через псевдонимы IBProvider: WIN-1251 и WINDOWS-1251.
Пустые значения свойств ctype, ctype_user и ctype_none замеяются на NONE.
| 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 32 bit нужно использовать 32-x битные ICU-библиотеки. При использовании IBProvider 64 bit - 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