免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: blogliou
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2006-10-31 09:18 |只看该作者

真是大好人,谢谢分享。

楼主真棒!!!!!!!!!!!!!

论坛徽章:
0
12 [报告]
发表于 2007-05-16 18:39 |只看该作者
收藏了

论坛徽章:
0
13 [报告]
发表于 2007-06-21 12:33 |只看该作者
有没有办法在检查到非法字符的时候将它休正过来呢?

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-06-20 06:20:00
14 [报告]
发表于 2007-06-25 10:20 |只看该作者
先收藏了,好东西啊,有时间试试

论坛徽章:
0
15 [报告]
发表于 2007-07-31 23:53 |只看该作者
楼主方法专业,可以编程使用
数据量不大,简单的方式可以
1。利用pcom/ca菜单里的外观设置--显示设置---so/si显示改成*yes,就可以看到汉字前/后导符(x'0e'/x'0f'),好像有快捷键,忘记了 (不好意思)
2.strsql中select hex(中文字段)看中文字段中内容的16进制数据,非法字符规则如楼主所说
3.dsppfm数据显示后用f10显示16进制数据,非法字符规则如楼主所说

论坛徽章:
0
16 [报告]
发表于 2008-09-02 14:35 |只看该作者
也SHOW一下我的 C 程序:

  1. /* ------------------------------------------------------------------------- */
  2. int  CheckEBCDIC_String(USGC *Estr, int Estrlen, USGC *RetErrMsg, int REMlen)
  3. /*
  4.    检查EBCDIC字符串合法性(通用函数)
  5.    M.L.Y  2004.10.15

  6.    本函数被RPGLE程序调用,其他程序如果需要也可以调用
  7.    参数:
  8.      USGC *Estr      - I, 待检查的EBCDIC字符串
  9.      int Estrlen     - I, 待检查的EBCDIC字符串长度
  10.      USGC *RetErrMsg - O, 返回错误报告的信息BUFFER
  11.      int REMlen      - I, 返回错误报告的信息BUFFER最大长度
  12.    返回:
  13.      0  - 正确
  14.      >0 - 出错位置
  15.    注意:必须保证RetErrMsg有足够的长度保存错误报告的信息
  16. */
  17. {
  18.   int  i, rc = 0;
  19.   int  stat = 0; /* 0=SBCS, 1=DBCS B1, 2=DBCS B2, 3=0x0E, 4=0x0F */
  20.   USGS A1, E1;
  21.   USGC vcs[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  22.                "abcdefghijklmnopqrstuvwxyz"
  23.                "01234567890"
  24.                " !??/"#$??/%&'()*+,-./"
  25.                ":;<=>?@??(??/??/??)??'_`{|}??-";

  26.   for(i = 0; i < Estrlen; i++)
  27.   {
  28.     if(stat == 1)      /* 汉字第1字节 */
  29.     {
  30.       if(Estr[i] <= 0x0F) /* 汉字第2字节不可能是00-0F */
  31.       {
  32.         rc = i + 1;
  33.         sprintf(RetErrMsg, "第%d字节(汉字第2字节)非法(ec=1)", rc);
  34.         break;
  35.       }
  36.       else
  37.       {
  38.         E1 = Estr[i-1] << 8 | Estr[i];
  39.         A1 = GBK_E2A(E1);
  40.         if(A1 == 0)
  41.         {
  42.           rc = i + 1;
  43.           sprintf(RetErrMsg, "第%d,%d字节不是合法的GBK EBCDIC编码(ec=2)",
  44.                   rc-1, rc);
  45.           break;
  46.         }
  47.         stat = 2;
  48.       }
  49.     }
  50.     else if(stat == 2) /* 汉字第2字节 */
  51.     {
  52.       if(Estr[i] <= 0x0E) /* 汉字第1字节不可能是00-0E */
  53.       {
  54.         rc = i + 1;
  55.         sprintf(RetErrMsg, "第%d字节不是0F或汉字第1字节非法(ec=3)",
  56.                 rc);
  57.         break;
  58.       }
  59.       else if(Estr[i] == 0x0F)
  60.       {
  61.         stat = 4;
  62.       }
  63.       else
  64.       {
  65.         stat = 1;
  66.       }
  67.     }
  68.     else if(stat == 3) /* 0x0E */
  69.     {
  70.       if(Estr[i] <= 0x0E) /* 汉字第1字节不可能是00-0E */
  71.       {
  72.         rc = i + 1;
  73.         sprintf(RetErrMsg, "第%d字节0E后非0F或汉字第1字节非法(ec=4)",
  74.                 rc);
  75.         break;
  76.       }
  77.       else if(Estr[i] == 0x0F)
  78.       {
  79.         stat = 4;
  80.       }
  81.       else
  82.       {
  83.         stat = 1;
  84.       }
  85.     }
  86.     else if(stat == 4) /* 0x0F */
  87.     {
  88.       if(Estr[i] == 0x0E)
  89.       {
  90.         stat = 3;
  91.       }
  92.       else if(Estr[i] == 0x0F)
  93.       {
  94.         rc = i + 1;
  95.         sprintf(RetErrMsg, "第%d字节为连续的0F(ec=5)", rc);
  96.         break;
  97.       }
  98.       else
  99.       {
  100.         if(strchr(vcs, Estr[i]) == NULL)
  101.         {
  102.           rc = i + 1;
  103.           sprintf(RetErrMsg, "第%d字节半角字符非法(ec=8)", rc);
  104.           break;
  105.         }
  106.         stat = 0;
  107.       }
  108.     }
  109.     else               /* 半角字符 */
  110.     {
  111.       if(Estr[i] == 0x0E)
  112.       {
  113.         stat = 3;
  114.       }
  115.       else if(Estr[i] == 0x0F)
  116.       {
  117.         rc = i + 1;
  118.         sprintf(RetErrMsg, "第%d字节为单独的0F(ec=6)", rc);
  119.         break;
  120.       }
  121.       else
  122.       {
  123.         if(strchr(vcs, Estr[i]) == NULL)
  124.         {
  125.           rc = i + 1;
  126.           sprintf(RetErrMsg, "第%d字节半角字符非法(ec=8)", rc);
  127.           break;
  128.         }
  129.         stat = 0;
  130.       }
  131.     }
  132.   }
  133.   if(rc == 0 && stat != 0 && stat != 4)
  134.   {
  135.     rc = i;
  136.     sprintf(RetErrMsg, "第%d字节字符串结尾非0F或半角字符(ec=7)", rc);
  137.   }
  138.   return rc;
  139. }


复制代码

论坛徽章:
0
17 [报告]
发表于 2008-09-04 15:43 |只看该作者
好东西
收着先

论坛徽章:
0
18 [报告]
发表于 2009-06-22 11:01 |只看该作者
好好。受教

论坛徽章:
0
19 [报告]
发表于 2014-01-07 10:53 |只看该作者
感谢分享,学无止境

论坛徽章:
0
20 [报告]
发表于 2014-03-24 08:53 |只看该作者
本帖最后由 franliu 于 2014-03-24 09:09 编辑

不错,不过VALIDATION LOGIC 不够严格。查出有错的必然是有错,不过没有查出错的也未必每个汉字都是合法的。有许多通过检验的可能还是含有乱码。因为许多双字节组合没有定义。

还有如果字符串中还有 0EOF (0e 和 0f 之间没有任何字符),这也不能算错.  如果可以加上一个参数可以自动修正字符串那就更好了。通常有错的字符串系统都不允许显示或编辑修正。


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP