在C语言中用嵌入式SQL访问DB2数据库时,中文字段显示出现错误,具体情况为空白,通过打印字符的16进制码,发现是操作系统不支持中文引起的。
开发环境为AIX6.1, DB2 V9.5, 用标准C开发应用程序。
查看语言设置,如下:
#locale
LANG=en_US
LC_COLLATE="en_US"
LC_CTYPE="en_US"
LC_MONETARY="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_MESSAGES="en_US"
LC_ALL=
系统目前为 英文,
查看系统支持的语言包如下:
#locale -a
C
POSIX
en_US.8859-15
en_US.ISO8859-1
en_US
显然,目前的系统没有安装 中文语言包,上网搜了一下,由于语言包为系统自带,需要AIX的安装光盘,找到AIX光盘,通过远程终端,上传如下文件包到服务器:
bos.iconv
bos.loc.com.CN
bos.loc.com.utf
bos.loc.iso.zh
bos.loc.utf.ZH_CN
1. 安装语言包,SMITTY INSTALLP, 进入上传文件包的位置,输入如下安装命令
#smitty installp
下一步, 选择 Install and Update from ALL Available Software, 回车,
再下一步, 在 * INPUT device / directory for software [] 中输入 " . " , 表示当前路径,
接着在 * SOFTWARE to install [] 的地方 按F4, 可以选择要安装的软件包,
注意: 安装的时候需要 root 身份登录, 启用有一个包有依赖,如果安装失败,需要先安装完其他的才可以继续安装。
安装完成,F3 退出SMITTY,
#locale -a
C
POSIX
ZH_CN.UTF-8
ZH_CN
Zh_CN.GB18030
Zh_CN
Zh_TW.big5
Zh_TW
en_US.8859-15
en_US.ISO8859-1
en_US
zh_CN.IBM-eucCN
zh_CN
zh_TW.IBM-eucTW
zh_TW
现在系统可以支持中文了, 有 UTF-8, BG18030 等,
2. 设置系统语言环境, 在 .profile 文件中加入环境变量(bash为 .bash_profile)
export LANG=ZH_CN.UTF-8 或者 export LANG=ZH_CN #支持utf-8
export LANG=Zh_CN.GB18030 或者 export LANG=Zh_CN #支持 GB18030
注意设置的 ZH_CN 与 Zh_CN 的区别, (h 大小写问题)
重新登录后,
#locale
LANG=ZH_CN.UTF-8
LC_COLLATE="ZH_CN.UTF-8"
LC_CTYPE="ZH_CN.UTF-8"
LC_MONETARY="ZH_CN.UTF-8"
LC_NUMERIC="ZH_CN.UTF-8"
LC_TIME="ZH_CN.UTF-8"
LC_MESSAGES="ZH_CN.UTF-8"
LC_ALL=
3. 编译程序,运行. 发现显示还是不正确, 不是空白了,但是是乱码
查看登录终端的设置, 我用的是Secure-CRT, 发现在 选项 / 会话选项 / 外观 / 字符编码 为 default,
选择UTF-8 , 保存退出。
再次登录,运行程序, O.K. 搞定了。
4. TUXODO 对中文的支持,由于涉及到TUXEDO, 同时在重启 TUXEDO 服务时出现如下错误,
NLS:4: Cannot open message catalog CMDTUX_CAT, set 1, num 748; check TUXDIR=/home/tuxedo/tuxedo8.1, LANG=ZH_CN.UTF-8
在TUXEDO 的主目录下,有一个 locale 目录, 进入后建立连接如下
# ln -s C ZH_CN.UTF-8
# ls -l
drwxr-xr-x 2 tuxedo tuxedo 4096 12月15 2010 C
lrwxrwxrwx 1 tuxedo tuxedo 1 1月09 17时23 ZH_CN.UTF-8 -> C
lrwxrwxrwx 1 tuxedo 300 1 12月08 14时02 en_US -> C
重新启动TUXEDO服务, 错误没有了。