版本:IBM InfoSphere DataStage V11.3.1
操作系统:linux redhat 6.4
数据库:Oracle 11.2.0.4.0
问题描述
前台反馈在加载表数据之后,出现乱码。截图如下:
![Clipboard Image.png](https://ask.hellobi.com/uploads/article/20160628/85b1295607e7cc3bea18c9f3dd4e0a04.png)
问题分析
前台调用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编码字符集 )
![Clipboard Image.png](https://ask.hellobi.com/uploads/article/20160628/622136e8575b421ce7b40f993a1cb673.png)
2.DS作业字符编码为GB2312 未通过Unicode编码转码,在服务端查看对应数据为乱码。
![Clipboard Image.png](https://ask.hellobi.com/uploads/article/20160628/27d36b4fc557ad112719d870dfb5c499.png)
3修改DS 作业将字符编码通过Unicode编码转换为UTF8
1:
![Clipboard Image.png](https://ask.hellobi.com/uploads/article/20160628/0700cd2c501534c23bbdc3dd8d8ea135.png)
2:
![Clipboard Image.png](https://ask.hellobi.com/uploads/article/20160628/050f7d8f76cf6bf7e50af2c4b5092e76.png)
再次查看Oracle 服务端 字符正常
![Clipboard Image.png](https://ask.hellobi.com/uploads/article/20160628/87944d8e9214cbe742a91bf2aa2b8734.png)
问题解决
A 将文件NLS映射为GB2312
![Clipboard Image.png](https://ask.hellobi.com/uploads/article/20160628/32f4501304902c52d9d4e964f82f0820.png)
B 在Sequential File 中对字符类型字段做Unicode 映射转换即可
![Clipboard Image.png](https://ask.hellobi.com/uploads/article/20160628/7a930983370f007d255df8b6e9dd4ce3.png)
问题总结
分析问题的过程,往往要比解决问题难一些。对于细节一定要多留意。