在400上汉字如果截取不当,会出现乱码,造成整条记录显示得不正常。
C* INCHAR为原始字段;OUTCHAR为输出字段
C* I1LEN 为需要取出的长度。所以I1LEN不能大于INCHAR的总长度
C*
C MOVEL *BLANKS INCHAR 64
C MOVEL *BLANKS OUTCHAR 64
C Z-ADD *ZERO I1LEN 3 0
C*
C EVAL INCHAR = '很长一个字符串'
C*假设需要取出30位长
C EVAL I1LEN = 30
C*********************************************************************
C* CHARBIT为取1位字符临时变量,判断是否为汉字指示器
C* NN用来判断循环时取第几位
C* KK用来判断当发现汉字指示器时,循环到了第几次
C MOVEL *BLANKS CHARBIT 1
C Z-ADD *ZERO NN 3 0
C Z-ADD *ZERO KK 3 0
C*
C EVAL NN = I1LEN + 1
C*
C DOW NN > 1
C EVAL NN = NN-1
C EVAL CHARBIT=%SUBST(INCHAR:NN:1)
C EVAL KK=I1LEN-NN
C**************************
C*最后两位即发现汉字指示器
C**************************
C SELECT
C WHEN CHARBIT=X'0E' AND KK=0
C EVAL OUTCHAR=%SUBST(INCHAR:1
I1LEN-1))
C LEAVE
C*
C WHEN CHARBIT=X'0E' AND KK<=2 AND KK>0
C EVAL OUTCHAR=%SUBST(INCHAR:1:NN)+X'0F'
C LEAVE
C**************************
C*指示器后有一个字的空间
C**************************
C WHEN CHARBIT=X'0E' AND KK>2
C KK DIV 2 WWLOOP 2 0
C MVR WWLEFT 1 0
C IF WWLEFT=0
C EVAL OUTCHAR=%SUBST(INCHAR:1
I1LEN-2))+X'0F'
C ELSE
C EVAL OUTCHAR=%SUBST(INCHAR:1
I1LEN-1))+X'0F'
C ENDIF
C LEAVE
C**************************
C*发现结束指示器直接赋值
C**************************
C*只要发现0E指示器,即表示有汉字;
C*所以如果一直未发现0E,而发现的第一个指示器为0F
C*那之前倒序查找的肯定都不是汉字,所以可以直接赋值
C WHEN CHARBIT=X'0F'
C EVAL OUTCHAR=%SUBST(INCHAR:1:I1LEN)
C LEAVE
C ENDSL
C**************************
C*未发现指示器
C**************************
C IF NN=1
C EVAL OUTCHAR=%SUBST(INCHAR:1:I1LEN)
C ENDIF
C*
C ENDDO
C*
C* DSPLY OUTCHAR
C EVAL *INLR = '1'