感觉有许多企业可能都会有检查数据中文字段是否有乱码的问题, 所以与大家分享这一函数:
http://www.cublog.cn/u/2405/showart.php?id=129792
检查汉字串中是否有半角或非法字符
AS400系统通过前置X’0E’字节和后置X’0F’字节来标识双字节汉字串。业务系统运行中经常情况下,因为各种原因,会造成汉字串混进非标准字符或X’0E’—X’0F’配对出现混乱,导致汉字串异常。业务员常常希望程序员能够从大量数据的表中自动检查出含有异常汉字串的记录。
这里提供一个检查汉字串中是否有半角或非法字符的函数与大家分享。
一.函数源码名CHECKCHNP,函数名C_CHECK
二.检查规则:
1。如果字符串中没有X'0E'和X'0F',则检查字符串是否全是常规半角字符,如果全是常规半角字符,则字符串有效,否则非法。
2。如果字符串中X'0E'和X'0F'不配对,则字符串非法。
3。如果X'0E'和X'0F'之间字符个数为奇数,则字符串为非法。
4。如果X'0F'在X'0E'前面,则字符串非法。
5。字符串中有X'00',则非法。
三:调用方法:
Eval WWSIGN=C_CHECK(CHNNAM)
其中CHNNAM为检查字段,WWSIGN为返回标识,如果WWSIGN不等于零,则该字段非法。
四:调用示范例子
检查TESTA文件中包含客户姓名(CHNNAM)字段是否非法,把有非法姓名的记录输出到TESTAQL文件里。
程序名TESTAPL, 用COPY方式包含过程原型说明头文件CHECKCHNH和过程源文件CHECKCHNP (也可以用module方式).编译时需选择DFTACTGRP为*NO.
CHECKCHNP, CHECKCHNH, TESTAPL打包在CHECKCHN中。
2006.6.19
[ 本帖最后由 blogliou 于 2006-6-19 12:17 编辑 ]
CHECKCHN.rar
pl421 回复于:2006-06-19 12:19:02
好东西,收了
qingzhou 回复于:2006-06-19 12:31:26
不错、不错~~~
老兄开始发标了,哈哈 :mrgreen:
加油。
blogliou 回复于:2006-06-19 12:47:08
最近失业了,无米下锅,闲着也是闲着,有海量数据清理任务或数据分析或双机热备的项目不妨跟我联系啊.
blogliou 回复于:2006-06-28 20:19:45
[CODE] 附件函数程序中主要就是交替使用了SCAN和CHECK以检查非法字符
*====================================================================*
* *
* *
* *
*--------------------------------------------------------------------*
* PROGRAM NAME : CHECKCHNP *
* PROGRAMMER : BLOG LIOU *
* CREATED DATE : 2004/05/21 *
*--------------------------------------------------------------------*
* DESCRIPTION :检查含有汉字串的字符串中是否有半角或非法字符 *
* *
* 根据汉字字符串前有X'0E'字节, *
* 后有X'0F'字节来简单判断非法字符 *
* *
* 1。如果字符串中没有X'0E'和X'0F',则检查字符串是否全是常规 *
* 半角字符,如果全是常规半角字符,则字符串有效,否则非法。 *
* 2。如果字符串中X'0E'和X'0F'不配对,则字符串非法。 *
* 3。如果X'0E'和X'0F'之间字符个数为奇数,则字符串为非法。 *
* 4。如果X'0F'在X'0E'前面,则字符串非法。 *
* 5。字符串中有X'00',则非法。 *
* *
*--------------------------------------------------------------------*
* INPUT FIELD : *
* CHNCHR :检查字符串最大长度为80 *
* *
* OUTPUT FILED : *
* WWSIGN : 1位长度,0为有效,1为非法 *
*====================================================================*
*
*====================================================================*
*
P C_CHECK B
D C_CHECK PI 1A
D CHNCHR 80A VALUE
D ENGCHAR C 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi-
D jklmnopqrstuvwxyz1234567890!@#$%^&*(-
D )-_=+[]{}\|;:,<.>/?`~"'' '
D CHID C X'00'
*
*
C MOVE '0' WWSIGN 1
C Z-ADD *ZERO EPOS 2 0
C Z-ADD *ZERO FPOS 2 0
C Z-ADD *ZERO EFLEN 2 0
C Z-ADD *ZERO EFNUM 2 0
*
C EVAL FFN = %SCAN(CHID:CHNCHR)
C IF FFN <> 0
C MOVE '1' WWSIGN
C GOTO ENDCNK
C ENDIF
*
C DOW 1 = 1
C ADD 1 EFNUM
C
C IF EPOS < 80
C IF FPOS < 80
C EVAL EPOS = %SCAN(X'0E':CHNCHR:EPOS+1)
C EVAL FPOS = %SCAN(X'0F':CHNCHR:FPOS+1)
C ELSE
C LEAVE
C ENDIF
C ELSE
C EVAL FPOS = 0
C ENDIF
*
C IF EPOS = 0 AND FPOS <> 0 OR
C EPOS <>0 AND FPOS = 0
C MOVE '1' WWSIGN
C LEAVE
C ENDIF
*
C IF EPOS = 0 AND FPOS =0
C IF EFNUM = 1
C ENGCHAR CHECK CHNCHR FFN 2 0
C IF FFN <> 0
C MOVE '1' WWSIGN
C LEAVE
C ENDIF
C ENDIF
C LEAVE
C ENDIF
*
C EVAL EFLEN = FPOS - EPOS
C IF EFLEN > 0
C MOVE EFLEN V1P 1 0
C IF V1P=0 OR V1P=2 OR V1P=4 OR V1P=6 OR V1P=8
C MOVE '1' WWSIGN
C LEAVE
C ENDIF
C ELSE
C MOVE '1' WWSIGN
C LEAVE
C ENDIF
C ENDDO
*
C ENDCNK TAG
C RETURN WWSIGN
P C_CHECK E
*
*====================================================================+
[/CODE]
qingzhou 回复于:2006-06-29 08:59:55
宝哥就是宝哥,,,出手还是那么大方,哈哈~~~
:mrgreen:
l.rover 回复于:2006-06-29 22:36:26
好贴子。
blogliou 回复于:2006-08-23 14:43:16
大家有什么别的好方法,可以一起共享嘛
liu__jiang 回复于:2006-08-23 15:12:45
Up
USING_AS400 回复于:2006-08-26 14:55:23
宝哥出手,必属好贴!
顶一下!
coachyang 回复于:2006-10-31 09:18:38
楼主真棒!!!!!!!!!!!!!
hedonglin 回复于:2007-05-16 18:39:52
收藏了
afeng8848 回复于:2007-06-21 12:33:13
有没有办法在检查到非法字符的时候将它休正过来呢?
magic_007 回复于:2007-06-25 10:20:54
先收藏了,好东西啊,有时间试试
|