如何编译 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 语言环境设置为我刚刚创建的语言环境。
详情:
- 我正在为 GLS locale/character 集创建一个
.lc
文件。但是,我找不到如何将该 .lc
文件编译成 .lco
文件。如何将 .lc
文件编译成 .lco
文件。
- 我也在寻找更多
.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' 您的数据,因为您告诉客户不需要转换。
概览:
我正在尝试制作自己的 GLS locale/character 套装。我这样做是为了将它添加到 GLS/lc11/en_us/myfile.lco
下我的 informix 实例中的语言环境,以便我可以将我的 database/db 语言环境设置为我刚刚创建的语言环境。
详情:
- 我正在为 GLS locale/character 集创建一个
.lc
文件。但是,我找不到如何将该.lc
文件编译成.lco
文件。如何将.lc
文件编译成.lco
文件。 - 我也在寻找更多
.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' 您的数据,因为您告诉客户不需要转换。