免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4472 | 回复: 13
打印 上一主题 下一主题

关于400上字符集的一个难题(附自己的一个解决方法),高手请进! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-28 21:05 |只看该作者 |倒序浏览
我目前遇到一个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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-03-28 21:14 |只看该作者
在线等啊,有没有高人现身啊~~~~

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-08-03 06:20:00
3 [报告]
发表于 2006-03-29 07:10 |只看该作者
我公司这里用
cpytopcd   把表在qdls共享目录下成为
txt文档资料,再访问
txt方法实现有汉字的字符串 table和其他系统交换数据 可以在命令中制定语言和用户的ccsid 可以没有关系

论坛徽章:
0
4 [报告]
发表于 2006-03-29 08:24 |只看该作者
试试看,谢谢!
不过,还是希望能够作个转码的实现,这才是高手的风格嘛!
我现在希望能够使用iconv来实现,只是不知道37的编码参数,谁能够告知:

。。。
   char    fromcode[33]="IBMCCSID013810000101";
    char    tocode[33]  ="IBMCCSID00935";
。。。
iconv(...)

不知道37怎么表示,也不知道怎么查看帮助,谁可以告诉偶?

论坛徽章:
0
5 [报告]
发表于 2006-03-29 08:57 |只看该作者
真的被搞晕了。不过想问一下你是怎样去掉400上自动增加的e/f串?

论坛徽章:
0
6 [报告]
发表于 2006-03-29 09:09 |只看该作者
这个帖子有深度,期待的解决办法。

论坛徽章:
0
7 [报告]
发表于 2006-03-29 15:25 |只看该作者
原帖由 chinagirlwang 于 2006-3-29 08:57 发表
真的被搞晕了。不过想问一下你是怎样去掉400上自动增加的e/f串?


这个很简单,通过16进制串检索发现就可以了,因为在我的应用里面,是不会出现0e/0f的串的,0e/0f是不可见字符,所以我就检索到直接干掉啦

[ 本帖最后由 aeou 于 2006-3-29 15:30 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-03-29 16:57 |只看该作者
看了看有点迷糊.................

汉字在400上的存储方式就是带0E/0F的,所以在设计数据库的时候就要考虑到这种存储方式占用的长度

我们通过ODBC,JDBC,ADO从400读出的中文数据都没发现会比正常的中文数据长

我觉得楼主解决问题找的思路不对,从另外的角度想想办法吧

[ 本帖最后由 xuguopeng 于 2006-3-29 17:00 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2006-03-29 18:52 |只看该作者

回复 4楼 aeou 的帖子

QtqIconvOpen 这个API实现iconv 同样的功能 参数不是那么烦 记得好久前贴过一个 可以看看是不是你要的

论坛徽章:
0
10 [报告]
发表于 2006-03-29 22:35 |只看该作者
原帖由 Eagle_wolf 于 2006-3-29 18:52 发表
QtqIconvOpen 这个API实现iconv 同样的功能 参数不是那么烦 记得好久前贴过一个 可以看看是不是你要的


通过iconv的转换,可以实现EBCDIC与ASCII码的转换,但是我的问题是希望能够找到935到37的编码转换思路,不过,好像不是那么简单,也问过了很多搞400的朋友,都没有怎么搞过,Double Byte转成Single Byte的好像有点难,可能还是要用偶的那种土办法,虽然是麻烦了点,但是,最终还是个解决我目前应用问题的途径
多谢楼上的答复哦
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP