免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 25031 | 回复: 20
打印 上一主题 下一主题

检查汉字串中是否有半角或非法字符 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-19 12:10 |只看该作者 |倒序浏览
感觉有许多企业可能都会有检查数据中文字段是否有乱码的问题, 所以与大家分享这一函数:

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

1.99 KB, 下载次数: 647

论坛徽章:
0
2 [报告]
发表于 2006-06-19 12:19 |只看该作者
好东西,收了

论坛徽章:
0
3 [报告]
发表于 2006-06-19 12:31 |只看该作者
不错、不错~~~

老兄开始发标了,哈哈 

加油。

论坛徽章:
0
4 [报告]
发表于 2006-06-19 12:47 |只看该作者
最近失业了,无米下锅,闲着也是闲着,有海量数据清理任务或数据分析或双机热备的项目不妨跟我联系啊.

论坛徽章:
0
5 [报告]
发表于 2006-06-28 20:19 |只看该作者
  1. 附件函数程序中主要就是交替使用了SCAN和CHECK以检查非法字符

  2.       *====================================================================*
  3.       *                                                                    *
  4.       *                                                                    *
  5.       *                                                                    *
  6.       *--------------------------------------------------------------------*
  7.       *   PROGRAM NAME   : CHECKCHNP                                       *
  8.       *   PROGRAMMER     : BLOG LIOU                                       *
  9.       *   CREATED DATE   : 2004/05/21                                      *
  10.       *--------------------------------------------------------------------*
  11.       *   DESCRIPTION    :检查含有汉字串的字符串中是否有半角或非法字符   *
  12.       *                                                                    *
  13.       *  根据汉字字符串前有X'0E'字节,                                *
  14.       *  后有X'0F'字节来简单判断非法字符                               *
  15.       *                                                                    *
  16.       *   1。如果字符串中没有X'0E'和X'0F',则检查字符串是否全是常规  *
  17.       *      半角字符,如果全是常规半角字符,则字符串有效,否则非法。    *
  18.       *   2。如果字符串中X'0E'和X'0F'不配对,则字符串非法。          *
  19.       *   3。如果X'0E'和X'0F'之间字符个数为奇数,则字符串为非法。    *
  20.       *   4。如果X'0F'在X'0E'前面,则字符串非法。                    *
  21.       *   5。字符串中有X'00',则非法。                               *
  22.       *                                                                    *
  23.       *--------------------------------------------------------------------*
  24.       *   INPUT FIELD    :                                                 *
  25.       *     CHNCHR       :检查字符串最大长度为80                         *
  26.       *                                                                    *
  27.       *   OUTPUT FILED   :                                                 *
  28.       *     WWSIGN       : 1位长度,0为有效,1为非法                 *
  29.       *====================================================================*
  30.       *
  31.       *====================================================================*
  32.       *
  33.      P C_CHECK         B
  34.      D C_CHECK         PI             1A
  35.      D   CHNCHR                      80A   VALUE
  36.      D ENGCHAR         C                   'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi-
  37.      D                                     jklmnopqrstuvwxyz1234567890!@#$%^&*(-
  38.      D                                     )-_=+[]{}\|;:,<.>/?`~"'' '
  39.      D CHID            C                   X'00'
  40.       *
  41.       *
  42.      C                   MOVE      '0'           WWSIGN            1
  43.      C                   Z-ADD     *ZERO         EPOS              2 0
  44.      C                   Z-ADD     *ZERO         FPOS              2 0
  45.      C                   Z-ADD     *ZERO         EFLEN             2 0
  46.      C                   Z-ADD     *ZERO         EFNUM             2 0
  47.       *
  48.      C                   EVAL      FFN  = %SCAN(CHID:CHNCHR)
  49.      C                   IF        FFN <> 0
  50.      C                   MOVE      '1'           WWSIGN
  51.      C                   GOTO      ENDCNK
  52.      C                   ENDIF
  53.       *
  54.      C                   DOW       1 = 1
  55.      C                   ADD       1             EFNUM
  56.      C
  57.      C                   IF        EPOS < 80
  58.      C                   IF        FPOS < 80
  59.      C                   EVAL      EPOS = %SCAN(X'0E':CHNCHR:EPOS+1)
  60.      C                   EVAL      FPOS = %SCAN(X'0F':CHNCHR:FPOS+1)
  61.      C                   ELSE
  62.      C                   LEAVE
  63.      C                   ENDIF
  64.      C                   ELSE
  65.      C                   EVAL      FPOS = 0
  66.      C                   ENDIF
  67.       *
  68.      C                   IF        EPOS = 0 AND FPOS <> 0 OR
  69.      C                             EPOS <>0 AND FPOS = 0
  70.      C                   MOVE      '1'           WWSIGN
  71.      C                   LEAVE
  72.      C                   ENDIF
  73.       *
  74.      C                   IF        EPOS = 0 AND FPOS =0
  75.      C                   IF        EFNUM = 1
  76.      C     ENGCHAR       CHECK     CHNCHR        FFN               2 0
  77.      C                   IF        FFN <> 0
  78.      C                   MOVE      '1'           WWSIGN
  79.      C                   LEAVE
  80.      C                   ENDIF
  81.      C                   ENDIF
  82.      C                   LEAVE
  83.      C                   ENDIF
  84.       *
  85.      C                   EVAL      EFLEN = FPOS - EPOS
  86.      C                   IF        EFLEN > 0
  87.      C                   MOVE      EFLEN         V1P               1 0
  88.      C                   IF        V1P=0 OR V1P=2 OR V1P=4 OR V1P=6 OR V1P=8
  89.      C                   MOVE      '1'           WWSIGN
  90.      C                   LEAVE
  91.      C                   ENDIF
  92.      C                   ELSE
  93.      C                   MOVE      '1'           WWSIGN
  94.      C                   LEAVE
  95.      C                   ENDIF
  96.      C                   ENDDO
  97.       *
  98.      C     ENDCNK        TAG
  99.      C                   RETURN     WWSIGN
  100.      P C_CHECK         E
  101.       *
  102.       *====================================================================+
复制代码

论坛徽章:
0
6 [报告]
发表于 2006-06-29 08:59 |只看该作者
宝哥就是宝哥,,,出手还是那么大方,哈哈~~~

论坛徽章:
0
7 [报告]
发表于 2006-06-29 22:36 |只看该作者
好贴子。

论坛徽章:
0
8 [报告]
发表于 2006-08-23 14:43 |只看该作者
大家有什么别的好方法,可以一起共享嘛

论坛徽章:
0
9 [报告]
发表于 2006-08-23 15:12 |只看该作者
Up

论坛徽章:
0
10 [报告]
发表于 2006-08-26 14:55 |只看该作者
宝哥出手,必属好贴!
顶一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP