版本:IBM InfoSphere DataStage V11.3.1
操作系统:linux redhat 6.4
数据库:Oracle 11.2.0.4.0
问题描述
前台反馈在加载表数据之后,出现乱码。截图如下:
问题分析
前台调用Java程序,字符串在java内存中总是按unicode编码存储的,比如"中文",正常情况下(即没有错误的时候)存储为"4e2d 6587",如果charset为"gbk",则被编码为"d6d0 cec4",然后返回字节"d6 d0 ce c4"。如果charset为"utf8"则最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1",则由于无法编码,最后返回 "3f 3f"(两个问号)。
而经过分析该表数据编码为iso8859-1,所以需要将iso8859-1转成UTF-8 。因为UTF-8是unicode的8位编码方式,是一种变长多字节编码,这种编码可以用1、2、3个字节表示一个unicode字符。
GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
GBK,GB2312以及Unicode都既是字符集,也是编码方式,而UTF-8只是编码方式,并不是字符集
GBK编码中英文字符只占一个字节
问题验证
1.数据库服务器字符集 :AL32UTF8 (AL32UTF8,UTF8、UTFE是UTF-8编码字符集 )
2.DS作业字符编码为GB2312 未通过Unicode编码转码,在服务端查看对应数据为乱码。
3修改DS 作业将字符编码通过Unicode编码转换为UTF8
1:
2:
再次查看Oracle 服务端 字符正常
问题解决
A 将文件NLS映射为GB2312
B 在Sequential File 中对字符类型字段做Unicode 映射转换即可
问题总结
分析问题的过程,往往要比解决问题难一些。对于细节一定要多留意。