如何编译 Informix GLS Locale/Character 集。 (将 .lc 文件转换为 .lco 以创建数据库的 Informix 语言环境)

How to compile an Informix GLS Locale/Character Set. (.lc file into .lco to make an Informix locale for databases)

概览:

我正在尝试制作自己的 GLS locale/character 套装。我这样做是为了将它添加到 GLS/lc11/en_us/myfile.lco 下我的 informix 实例中的语言环境,以便我可以将我的 database/db 语言环境设置为我刚刚创建的语言环境。

详情:

  1. 我正在为 GLS locale/character 集创建一个 .lc 文件。但是,我找不到如何将该 .lc 文件编译成 .lco 文件。如何将 .lc 文件编译成 .lco 文件。
  2. 我也在寻找更多 .lc 文件的示例作为我的基础。有谁知道我在哪里可以找到一些例子。我知道在 informix 实例中它们存储在文件夹 $INFORMIXDIR/GLS/lc11/os/ 中。

如果这不是您在 Informix 中创建 .lco GLS 字符集的方式。正确的步骤是什么?我还缺少任何步骤吗?

(我会把它作为答案,因为把它作为评论太重要了,从技术上讲,这个问题的答案应该是:"you can't, there is no Informix GLS compiler available for external use")

看你之前的问题,我想你想要的是一种过滤 ascii 字符的方法。 即使你可以,我也不会去写你自己的 gls 定义,它并不像听起来那么简单。

Informix 有一个普通的 ASCII 语言环境:

d:\infx\ids12\gls\cm3>grep ASCII registry
#         ASCII characters (except that a code-set name cannot begin with
#         The code-set number consists of 1 or more decimal ASCII digits
ASCII           364     # 0x016c

d:\infx\ids12\gls\cm3>

只有某些语言有它(如德语或西班牙语):

d:\infx\ids12\gls\cm3>dir ..\..6c.* /s
 Volume in drive D is Data750
 Volume Serial Number is F0B7-2E46

 Directory of d:\infx\ids12\gls\cm3

21/01/2017  20:23             6,408 016c.cmo
               1 File(s)          6,408 bytes

 Directory of d:\infx\ids12\gls\lc11\de_de

21/01/2017  20:25             4,369 016c.lco
               1 File(s)          4,369 bytes


 Directory of d:\infx\ids12\gls\lc11\es_es

21/01/2017  20:25             4,611 016c.lco
               1 File(s)          4,611 bytes

但没有什么能阻止您将语言环境文件 (.lco) 复制到 'en_us' 目录并使用它(当然,仅用于测试目的)。

d:\infx\ids12\gls\cm3>cp d:\infx\ids12\gls\lc11\de_de6c.lco d:\infx\ids12\gls\lc11\en_us

d:\infx\ids12\gls\cm3>

d:\infx\ids12\gls\cm3>dir d:\infx\ids12\gls\lc11\en_us
 Volume in drive D is Data750
 Volume Serial Number is F0B7-2E46

 Directory of d:\infx\ids12\gls\lc11\en_us

09/03/2018  11:07    <DIR>          .
09/03/2018  11:07    <DIR>          ..
09/03/2018  11:07             4,369 016c.lco
21/01/2017  20:25             2,666 0333.lco
21/01/2017  20:25             7,578 0333dict.lco
21/01/2017  20:25             4,071 0333dres.lco
21/01/2017  20:25             4,096 0333extn.lco
21/01/2017  20:25             4,412 0352.lco
21/01/2017  20:25             7,955 0352dict.lco
21/01/2017  20:25             4,410 04e4.lco
21/01/2017  20:25             7,824 04e4dict.lco
21/01/2017  20:25             7,818 04e4edic.lco
21/01/2017  20:25             4,410 04e4euro.lco
21/01/2017  20:25            63,649 e005.lco
21/01/2017  20:25            85,484 e01c.lco
21/01/2017  20:25             2,668 e02f.lco
21/01/2017  20:25             7,815 e02fdict.lco
21/01/2017  20:25            64,886 e030.lco
              16 File(s)        284,111 bytes
               2 Dir(s)  234,801,618,944 bytes free

d:\infx\ids12\gls\cm3>

之后,您应该能够使用 "en_US.ascii" 区域设置创建数据库:

D:\infx\ids12>set DB_LOCALE=en_US.ascii

D:\infx\ids12>set CLIENT_LOCALE=en_US.1252

D:\infx\ids12>dbaccess - -
> create database enusascii with log;

Database created.

> select * from sysmaster:sysdbslocale where dbs_dbsname='enusascii';

dbs_dbsname  enusascii
dbs_collate  en_US.364

1 row(s) retrieved.

>

如果您尝试插入任何大于 0x7F 的内容,它应该投诉:

D:\infx\ids12>od -t x1 test_ascii.unl
0000000000    74  D6  73  74  7C  0D  0A
0000000007

D:\infx\ids12>cat test_ascii.unl
t€st|

D:\infx\ids12>

....
Database created.

> create table t1(c1 char(10));

Table created.

> load from test_ascii.unl insert into t1;

23103: Code-set conversion function failed due to illegal sequence or invalid value.

  847: Error in load file row 1.
Error in line 1
Near character position 40
>

同一个文件可以加载到 819 数据库中:

D:\infx\ids12>set | grep LOCALE
CLIENT_LOCALE=en_US.1252
DB_LOCALE=en_US.819

D:\infx\ids12>dbaccess enus819 -

Database selected.

> load from test_ascii.unl insert into t1;

1 row(s) loaded.

>

您收到 23103,因为 GLS 转换函数检测到 0xD6 值 ('Ö') 的无效映射。 1252 和 ASCII 之间的转换文件显示大于 0x7F 的任何内容都会引发错误。

<source_version>        2
<modified_date>     "05-04-2004"
<source_codeset>      "Windows Code Page 1252"
<target_codeset>      "ASCII 7-Bit"

# Conversion Table
\x00...\xff \x00... #  Default everything onto itself
\x80    \x7f error  #  euro-sign
\x82    \x7f error  #  single low-9 quotation mark 
\x83    \x7f error  #  dutch guilder sign (ibm437 159) 
....    same.....
....
\xfd    \x7f error  #  latin small letter y with acute 
\xfe    \x7f error  #  latin small letter thorn (icelandic) 
\xff    \x7f error  #  latin small letter y with diaeresis 

请记住,只有在代码集之间存在转换时才会出现错误。如果您的 CLIENT_LOCALE 与 DB_LOCALE 相同,则没有人会 'filter/validate' 您的数据,因为您告诉客户不需要转换。