免费注册 查看新帖 |

Chinaunix

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

中文乱码程序讨论! (大家快来顶呀!) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-05-24 15:53 |只看该作者 |正序浏览
大家好:
   我这里有一段公司前辈的代码,用于处理中文乱码。可是,我太愚笨,每次只知道拿来用,看不懂什么意思。现拿来讨论,希望各位能详细注解它:(假设需要检查的中文字段为FIELD  30 )
-----------------------------------------------------------------

  1. C               @CHKNM    BEGSR                                
  2. C*CHECK CHAR FIELD(30  O)                                             
  3. C                     BITOF'0123'    XOF     1                  
  4. C                     BITON'4567'    XOF                        
  5. C                     BITOF'01237   XOE     1                  
  6. C                     BITON'456'     XOE                        
  7. C                     MOVELXOF     XOFF    2                  
  8. C*                                                               
  9. C                     Z-ADD0         INT1    20                  
  10. C                     Z-ADD0         INT2    20                  
  11. C                     Z-ADD0         ZOE     20                  
  12. C                     Z-ADD0         ZOF     20                  
  13. C                     Z-ADD1         I       20                  
  14. C                     Z-ADD1         J       20                  
  15. C                     Z-ADD0         JJ      30                 
  16. C*
  17. C         INT2     DOUGE30                           
  18. C        *IN90    OREQ '0'                          
  19. C          XOE     SCAN FIELD:I   INT1           98  
  20. C          INT1    ADD  1         I                  
  21. C    98             ADD  1         ZOE               
  22. C*                                                      
  23. C          XOF     SCAN FIELD:J   INT2           90  
  24. C          INT2    ADD  1         J                  
  25. C    90             ADD  1         ZOF               
  26. C                     ENDDO                             
  27. C*                                                      
  28. C       ZOE       IFGT ZOF                          
  29. C         30        SUB  INT1    JJ                 
  30. C          JJ        DIV  2          JJ         
  31. C                     MVR           JJ         
  32. C          JJ        IFEQ 0                     
  33. C                     MOVE XOFF      FIELD      
  34. C                     ELSE                       
  35. C                     MOVE XOF        FIELD      
  36. C                     ENDIF                     
  37. C                     ENDIF                     
  38. C*                                               
  39. C                     ENDSR                     
复制代码

-----------------------------------------------------------------
我的问题是:

  1. 1.         BITOF'0123'    XOF     1                  
  2.             BITON'4567'    XOF                        
  3.             BITOF'01237'   XOE     1                  
  4.             BITON'456'     XOE
复制代码

为什么XOF , XOE 不一样?AS400里面表示中文不是用16进制吗?这里应该是oe ,of 呀?这段是什么意思?

2.这段又是什么意思呀?

  1.      ZOE       IFGT ZOF                          
  2.           30        SUB  INT1      JJ                 
  3.            JJ         DIV  2          JJ         
  4.                       MVR           JJ         
  5.           JJ         IFEQ 0                     
  6.                       MOVE XOFF      FIELD      
  7.                       ELSE                       
  8.                       MOVE XOF         FIELD      
  9.                       ENDIF                     
  10.                       ENDIF         
复制代码

3.希望大家讨论,提出更好的办法.

论坛徽章:
0
13 [报告]
发表于 2004-05-28 09:44 |只看该作者

中文乱码程序讨论! (大家快来顶呀!)

谢谢大家!
    真是众人拾柴火焰高!
    我所提供的那段代码,已经被aeiou解释的很清楚了。
正如aeiou在第三点所说,它只能解决一些简单的中文问题。不知道大伙
还有其它什么好的办法和代码?平时遇到中文乱码是如何处理?请不吝共享。
    我们在ChinaUnix.net这样对于一个专题,深入的讨论,互相交流,
相信大家都会有所收获的。

论坛徽章:
0
12 [报告]
发表于 2004-05-27 23:15 |只看该作者

中文乱码程序讨论! (大家快来顶呀!)

1。XOF 和 XOE 都是1个字节长的字符型变量。BITOF和BITON是设置指定变量的指定位的二进制存储值为0或1。

BITOF'0123'    XOF     1                  
BITON'4567'    XOF        
XOF长度为1个字节,共8位(1byte=8bit)。这两句把变量XOF的前4位
置为'0000',后4位置为'1111',用二进制表示就是'00001111',用十六进制表示就是'0F',注意是 数字零 不是 字母O。

BITOF'01237   XOE     1                    
BITON'456'     XOE      
参考上面的解释。

2。
                                                      
C       ZOE       IFGT ZOF                          
C         30        SUB  INT1    JJ                  
C          JJ        DIV  2          JJ         
C                     MVR           JJ         
C          JJ        IFEQ 0                     
C                     MOVE XOFF      FIELD        
C                     ELSE                        
C                     MOVE XOF        FIELD        
C                     ENDIF                     
C                     ENDIF                     


400里面,对中文字符的解释是以 X'0E'开头,X'0F'结尾的,如果这两个标志不配对,就会出现乱码。ZOE大于ZOF,表示 X'0E' 的数量 大于 X'0F' 的数量,这样字符串FIELD就会乱码。这段程序的意思是想把少了的 X'0F' 补上,从而防止种文字符串的乱码。

INT1是检查到的 X'0E' 的位置的下一位,被字符串的总长度30减去以后,得到的 JJ 就是X'0E'之后还有多少个字符。

后面的两句是看 剩下的字符数量 是奇数还是偶数,如果得到的余数 JJ 等于0,就表示是偶数,如果不是0,表示是奇数。

因为一个汉字是占用2个字节的,如果剩下的字符数量是奇数,表示2位2位存储汉字以后,到第30位将只剩下1个字节,这时候这个字节应该是汉字的结束符 X'0F'了。如果剩下的字符数量是偶数,表示2位2位存储汉字的话,到第29位就应该写汉字的结束符了。这里它是用的 XOFF 来给最后两位赋值的,因为前面的程序已经给 XOFF 赋值了。

3。这个程序好像只能解决简单的问题。如果只有X'0F',或者标识符的排列顺序是X'0E'.....X'0E'......X'0F',或者X'0F'......X'0E'...的话,还是解决不了问题。

论坛徽章:
0
11 [报告]
发表于 2004-05-27 10:56 |只看该作者

中文乱码程序讨论! (大家快来顶呀!)

如果是PCOM话,在PC机器仿真界面上按Ctrl + F1看到'oe','of'.

论坛徽章:
0
10 [报告]
发表于 2004-05-27 10:55 |只看该作者

中文乱码程序讨论! (大家快来顶呀!)

如果是PCOM话,在PC机器仿真界面上按Ctrl + F1看不到'oe','of'.

论坛徽章:
0
9 [报告]
发表于 2004-05-27 10:26 |只看该作者

中文乱码程序讨论! (大家快来顶呀!)

你用的是client access的5250么?
如果是的话,可以在编辑菜单里选优先权----外观-----显示设置----DBCS显示---开启SO-SI显示

论坛徽章:
0
8 [报告]
发表于 2004-05-27 08:27 |只看该作者

中文乱码程序讨论! (大家快来顶呀!)

我在终端机上debug过,‘00001110’--‘oe' ;  '00001111'-----'of'

  1. C         INT2      DOUGE30                           
  2. C        *IN90     OREQ '0'                          
  3. C         XOE       SCAN FIELD:I   INT1           98  
  4. C          INT1      ADD  1         I                  
  5. C   98                ADD  1         ZOE               
  6. C*                                                      
  7. C         XOF       SCAN FIELD:J   INT2           90  
  8. C          INT2      ADD  1         J                  
  9. C   90                ADD  1         ZOF               
  10. C                       ENDDO                  
复制代码

这段是在要check的字段中分别查找 'oe','of', INT1,INT2纪录位置,ZOE,
ZOF纪录找到的'oe','of'个数。但是,下面这段为什么要这样处理呢?

  1. C         ZOE       IFGT ZOF                          
  2. C          30        SUB  INT1      JJ                 
  3. C            JJ        DIV  2          JJ         
  4. C                       MVR           JJ         
  5. C            JJ        IFEQ 0                     
  6. C                       MOVE XOFF      FIELD      
  7. C                       ELSE                       
  8. C                       MOVE XOF         FIELD      
  9. C                       ENDIF                     
  10. C                       ENDIF                     
复制代码

还请大家指教。另外,我在PC机器仿真界面上按Ctrl + F1看不到'oe','of'.
请问PC上如何才能看到中文的前导后导符呢?

论坛徽章:
0
7 [报告]
发表于 2004-05-26 13:02 |只看该作者

中文乱码程序讨论! (大家快来顶呀!)

是的,分别代表'oe' , 'of' 两个前导符和后导符

那么as400里面存储英文字母是使用十六进制的吗?
存储应该是ebcdic码吧,不过可以看到任何字符的十六进制代码
sql利用hex(),还有其它的方法

论坛徽章:
0
6 [报告]
发表于 2004-05-26 08:17 |只看该作者

中文乱码程序讨论! (大家快来顶呀!)

'00001110'  ----- 代表 'oe' ;
'00001111'  ----- 代表 'of'  .
是这样的吗?分别代表'oe' , 'of' 两个前导符和后导符?
那么as400里面存储英文字母是使用十六进制的吗?

论坛徽章:
0
5 [报告]
发表于 2004-05-25 17:56 |只看该作者

中文乱码程序讨论! (大家快来顶呀!)

1.         BITOF'0123'    XOF     1                    
            BITON'4567'    XOF                          
            BITOF'01237'   XOE     1                    
            BITON'456'     XOE
XOF就相当于16进制的 X'0F' 8位00001111
下一类同
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP