在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/