我目前遇到一个400上的字符集问题,希望有人可以指点一下,多谢!
事先声明一下,呵呵,一般网友就别看了,看了肯定弄晕你,因为在发贴的时候,我自己都琢磨
了半天不知怎么表达,应该说也的确是400上比较麻烦的一个问题,我用几个例子以及自己的一个解决方法,具体描述如下:
问题描述实例一:
我在400上的应用情况如下:
400上的用户1,ccsid=935,打印字符串的16进制串为:
字符串: 1 中文 a
长度( 8 ),(注:长度为8,是因为400上自动在中文的前后增加了0e/0f导致)
打印出来的字符串的16进制串为:
(f1)-(e)-(5b)-(cf)-(57)-(c3)-(f)-(81)-(0)
注:以上的()内标识的是一个字符的16进制串
将此段字符串(1 中文 a)写入了一个文件,用于后续的测试。
400上的用户2,ccsid=37,读取了935用户下写入的文件,读出的数据串已经为不可见字符,因
为编码不同的原因:
打印出来的字符串: 1 愔 a
长度:( 8 )
对应的字符串的16进制串为:
(f1)-(e)-(5b)-(cf)-(57)-(c3)-(f)-(81)-(0)
然后我自己处理了e/f的情况,就是自动去掉了400上自动增加的e/f串,显示如下:
打印出来的字符串: (1$ Ca)
长度:(6)
16进制串:
(f1)-(5b)-(cf)-(57)-(c3)-(81)-(0)-(81)-(0)
在上面的处理完成后,发现在37的情况其字符串的处理是错误的。
在37的情况下,其对应的正确的字符串应该是:
字符串: (1 a)
长度:(6)
16进制串:
(f1)-(ec)-(ac)-(76)-(63)-(81)
以上所谓我认为正确的是针对我的应用来说的,进行处理是应该正确的
问题描述实例二:
看了坛子里推荐的书,前段时间居士也发过贴的内容,就是《iseries技术指南》的附录二的例
子,我也做了测试,如下:
400的用户一: ccsid=935
字符串:( 我生于 1976 年),注意其中的()不是测试内容,主要是考虑到让大家清楚()内的内
容,下同
长度:(16)
其对应的16进制串:
(e) (57) (d1) (55) (9b) (5a) (7a) (f) (f1) (f9) (f7) (f6) (e) (52) (e9) (f)
400的用户二: ccsid=37
字符串: ( 1976 )
长度:(12)
其对应的16进制串:
(76) (ed) (71) (de) (ee) (fe) (f1) (f9) (f7) (f6) (63) (52)
我又在RS6000的机器上测试情况如下:
字符串:(我生于1976年)
长度:(12)
其对应的16进制串:
(ce) (d2) (c9) (fa) (d3) (da) (31) (39) (37) (36) (c4) (ea)
以上的两个测试例子表明,其实主要就是各个不同的代码页之间的字符转换的不同,应该说这个
问题困扰过很多人,只是大家都没有偶的应用搞得这么复杂罢了,呵呵
我现在的目的是希望:能够在ccsid=37的用户上,使用ccsid=935的数据(尤其是对双字节数据
的翻译),达到6000上的那种编码格式,其中的转换不知怎么进行?
有没有人指点一二
附:我的另外一种解决方法:
在6000上,我做为中转处理,首先用ftp取回935的数据文件:
ftp ...
asc
type c 1386
get ...
...
然后,再用ftp放到37的用户下
ftp ...
asc
type c 819
put ...
...
这样,在400上,37的用户读出来的字符串就是偶需要的了,只是这种方法一个是太笨(已经是
杀死偶很多脑细胞后产生的解决方法了,555),另外一个不能够在37的用户下400上实时的做操
作处理,解决是解决了,但好像很土。
希望看完本贴后,还没有搞晕且头脑一直处于清醒状态的高手人指点一二,搞晕的兄弟们帮着顶
一下帖子吧,呵呵,多谢啊!版主大人们,99o~~~
[ 本帖最后由 aeou 于 2006-3-28 21:06 编辑 ]
aeou 回复于:2006-03-28 21:14:10
在线等啊,有没有高人现身啊~~~~
tomroom 回复于:2006-03-29 07:10:55
我公司这里用
cpytopcd 把表在qdls共享目录下成为
txt文档资料,再访问
txt方法实现有汉字的字符串 table和其他系统交换数据 可以在命令中制定语言和用户的ccsid 可以没有关系
aeou 回复于:2006-03-29 08:24:00
试试看,谢谢!
不过,还是希望能够作个转码的实现,这才是高手的风格嘛!
我现在希望能够使用iconv来实现,只是不知道37的编码参数,谁能够告知:
。。。
char fromcode[33]="IBMCCSID013810000101";
char tocode[33] ="IBMCCSID00935";
。。。
iconv(...)
不知道37怎么表示,也不知道怎么查看帮助,谁可以告诉偶?
chinagirlwang 回复于:2006-03-29 08:57:29
真的被搞晕了。不过想问一下你是怎样去掉400上自动增加的e/f串?
xf001 回复于:2006-03-29 09:09:03
这个帖子有深度,期待的解决办法。
aeou 回复于:2006-03-29 15:25:12
引用:原帖由 chinagirlwang 于 2006-3-29 08:57 发表
真的被搞晕了。不过想问一下你是怎样去掉400上自动增加的e/f串?
这个很简单,通过16进制串检索发现就可以了,因为在我的应用里面,是不会出现0e/0f的串的,0e/0f是不可见字符,所以我就检索到直接干掉啦
[ 本帖最后由 aeou 于 2006-3-29 15:30 编辑 ]
xuguopeng 回复于:2006-03-29 16:57:37
看了看有点迷糊.................
汉字在400上的存储方式就是带0E/0F的,所以在设计数据库的时候就要考虑到这种存储方式占用的长度
我们通过ODBC,JDBC,ADO从400读出的中文数据都没发现会比正常的中文数据长
我觉得楼主解决问题找的思路不对,从另外的角度想想办法吧
[ 本帖最后由 xuguopeng 于 2006-3-29 17:00 编辑 ]
Eagle_wolf 回复于:2006-03-29 18:52:00
QtqIconvOpen 这个API实现iconv 同样的功能 参数不是那么烦 记得好久前贴过一个 可以看看是不是你要的
aeou 回复于:2006-03-29 22:35:24
引用:原帖由 Eagle_wolf 于 2006-3-29 18:52 发表
QtqIconvOpen 这个API实现iconv 同样的功能 参数不是那么烦 记得好久前贴过一个 可以看看是不是你要的
通过iconv的转换,可以实现EBCDIC与ASCII码的转换,但是我的问题是希望能够找到935到37的编码转换思路,不过,好像不是那么简单,也问过了很多搞400的朋友,都没有怎么搞过,Double Byte转成Single Byte的好像有点难,可能还是要用偶的那种土办法,虽然是麻烦了点,但是,最终还是个解决我目前应用问题的途径
多谢楼上的答复哦
andrewleading_h 回复于:2006-04-02 17:52:29
昏了,探索中...
aeou 回复于:2006-04-03 21:59:56
引用:原帖由 andrewleading_h 于 2006-4-2 17:52 发表
昏了,探索中...
呵呵,不好意思啊,偶对不住CU的兄弟们啊……
在听了楼主各位的指点后,以及找了N多的哥们咨询后,发现还是不能解决,偶已经转换思路了,另劈捷径……,:)
aeiou 回复于:2006-04-08 10:45:08
帮顶一下!
对这个字符集一直没有仔细研究过。想问一下楼主,为什么两个用户的CCSID要设置成不一样的呢?
另外,晕晕的问一下,把文件的CCSID935直接改成37可以实现你的要求吗?
aeou 回复于:2006-04-08 22:13:20
引用:原帖由 aeiou 于 2006-4-8 10:45 发表
帮顶一下!
对这个字符集一直没有仔细研究过。想问一下楼主,为什么两个用户的CCSID要设置成不一样的呢?
另外,晕晕的问一下,把文件的CCSID935直接改成37可以实现你的要求吗?
呵呵,把两个用户的ccsid设置成不一样也非偶所愿,只是无奈之下应用要求这样做的,你也知道了,我们作技术的都是为应用服务的啦
另外,通过chgpf修改pf的ccsid,这种方式只能够将文件的属性进行修改,其中的内容是无法修改的
|