请教高手多模匹配问题

llyyt85 2011-07-25 10:56:51
现在有很多多模匹配算法,像wu-manber,但这些算法很多不支持中文。遇到有中文的字符串就报错。请教一下,我该怎么改?有源码更好,谢谢。
...全文
194 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
angelsys 2013-06-04
  • 打赏
  • 举报
回复
去看 柔性字符串匹配 或直接看grep agrep 的源码
llyyt85 2011-07-28
  • 打赏
  • 举报
回复
在程序中遇到不支持中文的时候,一般都怎么解决的啊?各位老师指点下啊
llyyt85 2011-07-27
  • 打赏
  • 举报
回复
救命啊,快沉了
llyyt85 2011-07-27
  • 打赏
  • 举报
回复
有好的思路也行啊。
llyyt85 2011-07-27
  • 打赏
  • 举报
回复
中文字符的编码方式好多。哪位有好的源码啊?帮帮我
ArtStealer 2011-07-27
  • 打赏
  • 举报
回复
帮顶
偶只会KMP匹配。
wuyuwww 2011-07-27
  • 打赏
  • 举报
回复
++帮顶
赵4老师 2011-07-26
  • 打赏
  • 举报
回复
//GBK汉字内码范围(不包括A1xx~A9xx的标点符号英文字母特殊符号等)
//区码 ,位码
//81-A0 ,40-7E 80-FE
//AA-AF ,40-7E 80-A0
//B0-D6 ,40-7E 80-FE
//D7 ,40-7E 80-F9
//D8-F7 ,40-7E 80-FE
//F8-FE ,40-7E 80-A0
luciferisnotsatan 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 llyyt85 的回复:]

引用 2 楼 blowlow 的回复:

没用过,但建议你把Unicode转为utf-8,然后再匹配。


linux下怎么转换?如何判断当前字符串的编码类型?
[/Quote]
linux下用iconv库
c_losed 2011-07-26
  • 打赏
  • 举报
回复
 UTF8是以8bits即1Bytes为编码的最基本单位,当然也可以有基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前用得不多,而UTF8则被广泛应用在文件储存和网络传输中。
  编码原理
  先看这个模板:
  UCS-4 range (hex.) UTF-8 octet sequence (binary)
  0000 0000-0000 007F 0xxxxxxx
  0000 0080-0000 07FF 110xxxxx 10xxxxxx
  0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
  0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx
  编码步骤:
  1) 首先确定需要多少个8bits(octets)
  2) 按照上述模板填充每个octets的高位bits
  3) 把字符的bits填充至x中,字符顺序:低位→高位,UTF8顺序:最后一个octet的最末位x→第一个octet最高位x
  根据UTF8编码,最多可由6个字节组成,所以UTF8是1-6字节编码组成
  C++代码如下:
int IsTextUTF8(char* str,ULONGLONG length)
  {
  int i;
  DWORD nBytes=0;//UFT8可用1-6个字节编码,ASCII用一个字节
  UCHAR chr;
  BOOL bAllAscii=TRUE; //如果全部都是ASCII, 说明不是UTF-8
  for(i=0;i<length;i++)
  {
  chr= *(str+i);
  if( (chr&0x80) != 0 ) // 判断是否ASCII编码,如果不是,说明有可能是UTF-8,ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx
  bAllAscii= FALSE;
  if(nBytes==0) //如果不是ASCII码,应该是多字节符,计算字节数
  {
  if(chr>=0x80)
  {
  if(chr>=0xFC&&chr<=0xFD)
  nBytes=6;
  else if(chr>=0xF8)
  nBytes=5;
  else if(chr>=0xF0)
  nBytes=4;
  else if(chr>=0xE0)
  nBytes=3;
  else if(chr>=0xC0)
  nBytes=2;
  else
  {
  return FALSE;
  }
  nBytes--;
  }
  }
  else //多字节符的非首字节,应为 10xxxxxx
  {
  if( (chr&0xC0) != 0x80 )
  {
  return FALSE;
  }
  nBytes--;
  }
  }
  if( nBytes > 0 ) //违返规则
  {
  return FALSE;
  }
  if( bAllAscii ) //如果全部都是ASCII, 说明不是UTF-8
  {
  return FALSE;
  }
  return TRUE;
  }

from
llyyt85 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 blowlow 的回复:]

没用过,但建议你把Unicode转为utf-8,然后再匹配。
[/Quote]

linux下怎么转换?如何判断当前字符串的编码类型?
llyyt85 2011-07-26
  • 打赏
  • 举报
回复
大家帮帮忙啊,帮忙讲解下中文字符串匹配问题
llyyt85 2011-07-26
  • 打赏
  • 举报
回复
wu-manber是一种多模匹配算法,一次可以匹配多个关键词。无奈不支持中文,想自己改算法又水平有限。我想用这个算法过滤中文敏感信息,目前有两种思路:1,将所有的数据转换为指定编码,改进wu-manber算法,使之支持该编码,匹配数据;2,不考虑编码类型,用wu-manber算法尝试各种编码可能,多次匹配。哪位高人有相关资料,烦劳指点一下啊。
nightkids_008 2011-07-25
  • 打赏
  • 举报
回复
友情顶贴。。。KMP
blowlow 2011-07-25
  • 打赏
  • 举报
回复
没用过,但建议你把Unicode转为utf-8,然后再匹配。
至善者善之敌 2011-07-25
  • 打赏
  • 举报
回复
帮顶。。

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧