Chinaunix首页 | 论坛 | 博客
  • 博客访问: 66179
  • 博文数量: 11
  • 博客积分: 1455
  • 博客等级: 上尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-10 12:28
文章分类

全部博文(11)

文章存档

2018年(1)

2012年(1)

2011年(5)

2009年(1)

2008年(3)

我的朋友
最近访客

分类:

2008-06-17 00:54:51

在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:1I1LEN-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:1I1LEN-2))+X'0F'
     C                   ELSE
     C                   EVAL      OUTCHAR=%SUBST(INCHAR:1I1LEN-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'
 
文章原出处:
 
阅读(941) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:SUBFILE和WINDOW的一起应用问题

给主人留下些什么吧!~~