• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

在AS400中怎么得到汉字的内码?怎么区分汉字前后的前导符后导符?

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 35次 | 进入软件测试论坛讨论

领测软件测试网
在AS400中怎么得到汉字的内码?怎么区分汉字前后的前导符后导符?
在画面上显示时汉字前面会出现一个空格,称之为前导符吧,同样汉字最后也会出现一个空格(后导符?),怎么得到每个汉字的内码呢,并把前导符后导符去掉?

 qingzhou 回复于:2005-06-30 16:16:45
AS400汉字内码表好象要找资料的吧。
前导符+后导符=占1个汉字位置,这个由400系统自动加载以区别汉字,如果去掉程序在处理时不会出错么?400还能识别么?

CL程序中用来处理字符串的操作符:“*bcat”、“*cat”、“*tcat”能用上吗?

 fxf_china 回复于:2005-06-30 17:36:08
我不是想去掉前导符和后导符,我是要替换汉字内码,但先要区分它是汉字还是前导符,后导符
在WINDOWS平台,字符'A'的ASCII码是65(十进制),用高级语言很容易得到,汉字倒是没试过,应该也可以吧
存贮在磁盘上的都是象 65 这种代码吧,每个汉字有两个字节组成,每个字节最高为是1,即转换成代码的话应该大于128
我现在在AS400下试了一下,定义了一个4O的变量,正好放一个汉字,然后传到一个I表,I表拆分成四个字符,再把每个字符转成二进制变量,这个变量应该是汉字的内码吧,可看这值不对啊

 Eagle_wolf 回复于:2005-06-30 17:42:57
ascii 码中汉字都是大于128的 但是 400上的ebcdic不一定都大于128

 fxf_china 回复于:2005-06-30 18:20:24
呵呵,原来如此

 fairyboy 回复于:2005-07-24 00:19:41
那问一下,如果有2个汉字,比如说是 系统这2个汉字,在 400内是
‘ 系统 ’,那么我想把 系和统这2个字,分别给2个字端,有啥方法不?

 kempzhang 回复于:2005-07-24 20:43:45
[quote:6f02653e06="fairyboy"]那问一下,如果有2个汉字,比如说是 系统这2个汉字,在 400内是
‘ 系统 ’,那么我想把 系和统这2个字,分别给2个字端,有啥方法不?[/quote:6f02653e06]
要分别给两个字段的话,这两个字段也一定要是4位长,第一位是前导符,最后一位是后导符,中间两位是真正这个汉字。至于怎么取道前导符和后导符,可以用BITOF 和BITON实现。具体的怎么几位明天看了以前的程序在贴出来。

 Eagle_wolf 回复于:2005-07-24 20:56:21
利用16进制试试

 fairyboy 回复于:2005-07-24 21:18:37
[quote:b4d2b87ff6="Eagle_wolf"]利用16进制试试[/quote:b4d2b87ff6]

请教一下,具体怎么做呢?

 Eagle_wolf 回复于:2005-07-24 21:39:35
如果只是两个字很好办,如果是不定长的话,就不好办了,今天有点晚,明天吧
试着写个看看

 kempzhang 回复于:2005-07-25 09:22:12
前導符
C                     BITOF'01237'   ITOE    1
C                     BITON'456'     ITOE     
後導符
C                     BITOF'0123'    ITOF    1
C                     BITON'4567'    ITOF

 Eagle_wolf 回复于:2005-07-25 11:11:48
上面的其实就是eval itoe=x'0e'  itof=x'0f'

昨天说的16进制的方法有点麻烦 用rpg写很费尽啊
字符转换成16进制还可以 反过来就有点烦了
用rexx吧 很容易

[code:1:4240347b84]parse arg  a                      
options  exmode                   
a=strip(a)                        
b=1                               
do  forever                       
if  b > length(a) then leave      
c = substr(a,b,1)                 
b = b + 1                         
say c                             
end                               [/code:1:4240347b84]

 roden 回复于:2005-07-25 12:36:18
前導符 
C                     MOVE X'0E'    ITOE    1 
後導符 
C                     MOVE X'0F'    ITOF    1

 Eagle_wolf 回复于:2005-07-25 12:43:58
请教楼上,把16进制转换成字符有什么方法吗 例如一个字符串
'F1F2F3'  应该等于'123'  怎么转换呢

 roden 回复于:2005-07-25 12:52:11
我没有试过,不过用对照表应该是可以实现的。除双字节的字符
是有限的,把他们放到数组中,对应转换。
F1   1
F2   2
F3   3
.......

 Eagle_wolf 回复于:2005-07-25 12:57:41
这样比较麻烦 而且还有双字节的问题 不知道eb码的双字节有法判断吗
如ascii码里面 第一个字节大于128之类的

 Eagle_wolf 回复于:2005-07-25 17:43:58
TO fairyboy
昨天说写个看看,今天下午试着写了个,不过还是没利用16进制,转换比较烦
昨天没加考虑就说出去了 惭愧
[code:1:c4589905aa]     H*  Programe No. :
     H*          Text :
     H*      Function : recombine  the string
     H*
     H*     Programer :
     H*
     H*  Date Created :
     H*
     H**********************************************************************
     H DATFMT(*ISO)  COPYRIGHT('(C) Copyright lardbucket.Dalian 2005')
     H DATEDIT(*YMD)
     H Nomain
     H*********************************************************************
     Ffile      o    e             disk      usropn
     D Recombine       PR            10I 0   opdesc
     D   source1                   1024      Const OPTIONS(*VARSIZE)
     D   Lengths                     10I 0   Const Options(*nopass)
     D
     D Delstr          PR
     D   source2                   1024      OPTIONS(*VARSIZE)
     D   len                         10I 0
     D   dellen                      10I 0
     D
     D getOpD          PR                  ExtProc('CEEDOD') OPDESC
     D ParmNum                       10I 0 CONST
     D                               10I 0
     D                               10I 0
     D                               10I 0
     D                               10I 0
     D                               10I 0
     D                               12A   OPTIONS(*OMIT)
     P Recombine       B                     export
     D Recombine       PI            10I 0   opdesc
     D   source1                   1024      Const OPTIONS(*VARSIZE)
     D   Lengths                     10I 0   Const Options(*nopass)

      * Parameters passed to CEEDOD
     D DescType        S             10I 0
     D DataType        S             10I 0
     D DescInfo1       S             10I 0
     D DescInfo2       S             10I 0
     D InLen           S             10I 0
     D
     D
     D HexLen          S             10I 0
     D Couple          C                   Const('0e and 0f are not in pairs')
     DSingle           S              1
     DDsChinese        Ds
     Dd0                              1    Inz(X'0e')
     Dd1                              2
     Dd2                              1    Inz(x'0f')
     Dpos0e            s             10I 0
     Dpos0f            s             10I 0
     Dtmpv             s             10I 0
     DNoDbcs           s              1    Inz('0')
     Dreal             s             10I 0
     DLength           s             10I 0
     Dsource           s           2048A
     D
     D*--------------------------------------------------------------
      ***the length must be smaller than 2048
      
     C
     C                   Movel     source1       source
     C                   If        %Parms = 1
     C                   CALLP     GetOpd(1         : DescType : DataType :
     C                                    DescInfo1 : DescInfo2: Inlen    :
     C                                    *OMIT)
     C                   Z-add     InLen         HexLen
     C                   Else
     C                   Z-Add     Lengths       HexLen
     C                   EndIf
     C
     C                   if        not%open(file)
     C                   open      file
     C                   endif
     C
     C                   Dou       HexLen = 0
     C                   eval      pos0e = 0
     C     x'0e'         Scan      source        pos0e                    10
     C                   If        Not%found
     C                   Eval      Pos0e = HexLen
     C                   Eval      HexLen = 0
     C                   Eval      NoDbcs = '1'
     C                   EndIf
     C                   If        pos0e > 1
     c                   If        NoDbcs = '0'
     C                   Eval      tmpv  = pos0e - 1
     C                   endIf
     C                   Do        tmpv          real
     C                   Eval      single = %subst(source:real:1)
     C                   Eval      record = single
     C                   Write     filer
     C                   Enddo
     C                   EndIf
     C                   If        NoDbcs = '0'
     C     x'0f'         Scan      source        pos0f                    10
     C                   if        not%found
     C     Couple        dsply
     C                   return    0
     C                   endIf
     C                   Eval      length = pos0f - pos0e -1
     C                   Eval      length = length / 2
     C                   Do        length
     C                   Eval      d1 = %subst(source:pos0e+1:2)
     C                   Eval      record = DsChinese
     C                   Eval      pos0e = pos0e + 2
     C                   Write     filer
     C                   Enddo
     C                   Callp     delstr(source:HexLen:pos0f)
     C                   Eval      HexLen = HexLen - pos0f
     C                   EndIf
     C                   EndDo
     C                   if        %open(file)
     c                   close     file
     C                   endIf
     C                   Return    1
     P                 E
      *delstr
      *
     Pdelstr           B
     DDelstr           PI
     D str                         1024    options(*varsize)
     D len                           10I 0
     D delLen                        10I 0
     C                   Eval      str = %subst(str:dellen+1:len-dellen)
     C                   return
     P                 E

[/code:1:c4589905aa]

file     

r     filer 
      record     4o

 pl421 回复于:2005-07-25 21:56:21
[quote:d8586e3323="Eagle_wolf"]
file     

r     filer 
      record     4o[/quote:d8586e3323]
CALLP看得头晕.

 wildfish 回复于:2005-07-26 07:48:39
据说可以用unicode,这样就没有前/后导符,不过只有sap有用,还有对机器要求版本比较高,最好i5.不过不知道rpg怎么处理就是了。

 span1024 回复于:2005-07-26 13:14:47
我试了一下,如果把字符字段定义为UCS-2(unicode)字符集的话,在这个字段里就没有前导符和结束符了,但是输入英文字母就有问题了.

定义的物理表如下:
A* CUSTMONER INFORMATION TABLE
A     R   RCUST
A          CUSTID       12G     CCSID(13488)

因为最近考虑在400上实现直接生成PDF文件的一个库,其中涉及到转码的问题,单字节转码很简单,多字节比较麻烦,虽然也有一个办法,但是自我感觉不太好

 qingzhou 回复于:2005-07-27 14:39:57
如果要对37,65535的字段进行中文模糊查询,必须充分考虑在单字节环境下对简体中文的处理过程,即把一个双字节字符(加上0E/0F控制码)当作4个字节来处理,而这些字节包含的数据是无法在单字节环境下正确解析的。所以,必须使用16进制的方式来处理。
比如用户要检索的是“系统”的中文模糊查询,则检索的条件必须写成:
Select * from MyPF where  NAME like  SUBST(HEX('系统'),1,5)||'%'
因为0E/0F只出现在双字节字符串的开头和结尾,所以两个汉字需要检索的字符个数是5个。

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网