2009-04-08 50 views
4

我有utf-8编码文件包含阿拉伯文本,我必须搜索它。德尔福2009年:在unicode搜索跳过变音符utf-8

我的问题是变音符号,如何搜索跳过它们?

就像在Internet Explorer中加载文本(转换HTML中的文本)一样,IE正在跳过那些变音符号?

任何帮助?

EDIT1:搜索是简单地通过下面的代码进行:

var m1 : TMemo; //contains utf-8 data) 
    m2 : TMemo; // contains results 

... 

     m2.lines.BeginUpdate; 
     for s in m1.Lines do 
     begin 
     if pos(eSearch.Text,s)>0 then 
      begin 
      m2.Lines.Add(s); 
      end; 
     end; 
     m2.Lines.EndUpdate; 

EDIT2:Unicode数据的例子:

قلهواللهأحد 如果只搜索没有变音符号的字母قل的字قل不会被发现。

+0

你如何执行搜索? – 2009-04-08 14:04:21

回答

2

我发现变音符不是唯一的问题。

我会做字符替换,用空字符串取代它们,我还会规范化文本'أ''إ''''全部转换为''',并且也为ìؤdo ةه...

对于搜索我还使用了光词干像“加尼词干”(Java源here

更先进的方法是做它喜欢TREC

  • 删除标点符号
  • 删除变音符号(主要是弱元音)大部分语料库不包含弱元音。
  • 一些字典条目包含弱元音。这使得一切都一致。
  • 删除非字母
  • 用裸alif替换初始إ或أ。ا
  • 替换آ与ا
  • 更换序列ىء与ئ
  • 替换最终ى与ي
  • 替换最终ة与ه
  • 地带6个前缀:定冠词(فالآال,بال,وال, ال,)和و从归一化的话,从单词的端部
  • 地带10个后缀的开端 (和)اتان,ها,ية,ه,ية,يه,ين,ون

我会通过这个修改后的文本(对于备忘录我将这个词的索引存储在原始文本中)索引文本,并为搜索查询做同样的事情。

我也会在Memo1.Text中搜索,而不是逐行搜索,搜索可能是多个单词,可能在一行的末尾并包装到下一行。

5

在Vista +上,您可以(我没有阿拉伯语的经验)使用CompareString并带有LINGUISTIC_IGNOREDIACRITIC选项。

NORM_IGNORENONSPACE也可能有所帮助。然后再次,it may not

另外(但我只是猜测)你可能能够解析你的字符串GetStringTypeEx并手动删除变音符号。可能您必须先致电FoldStringMultiByteToWideChar,并首先标记MAP_COMPOSITE。

相关问题