| 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个。
|