Delphi 2009:在Unicode UTF-8中跳过重音符号的搜索

4

我有一个包含阿拉伯文本的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数据示例:

如果您只搜索没有附加符号的字母,则不会找到带有符号的单词“قُلْ”。而要搜索该单词,需要输入“قل”。


你如何执行搜索? - Daniel Rikowski
代码已添加到问题中。 - Irfan Mulic
2个回答

5
在Vista+上,你可能可以(我对阿拉伯语没有经验)使用选项LINGUISTIC_IGNOREDIACRITIC的CompareString
NORM_IGNORENONSPACE也可能有所帮助。但是,也可能不行
另外(但我只是猜测),你可以使用GetStringTypeEx解析字符串,并手动删除变音符号。可能需要先使用MAP_COMPOSITE标志调用FoldStringMultiByteToWideChar

2
我发现音标并不是唯一的问题。我会进行字符替换,将它们替换为空字符串,我也会规范化文本,如将 'أ' 'إ' 'آ' 转换为 'ا',对于 ى ئ ي ؤ 和 ة 做相同的处理... 对于搜索,我还会使用类似 "khoja stemmer"(Java源代码在这里)的轻量级词干削减器。更先进的方法是像TREC那样做。
  • 去除标点符号
  • 去除变音符号(主要是弱元音)。大部分语料库不包含弱元音。
  • 一些词典条目包含弱元音。这使得所有内容都一致。
  • 去除非字母字符
  • 将初始的 إ 或 أ 替换为裸阿拉伯字母 ا
  • 将 آ 替换为 ا
  • 将 ىء 序列替换为 ئ
  • 将末尾的 ى 替换为 ي
  • 将末尾的 ة 替换为 ه
  • 从规范化单词的开头删除6个前缀:定冠词 ( فال آال، بال، وال, ال、) 和和 (and)
  • 从单词的结尾删除10个后缀:ات ان، ها،ي ة、 ه、 ية、 يه、 ين、和ون

我将使用修改后的文本对文本进行索引(对于备忘录,我会存储单词在原始文本中的索引),并对搜索查询执行相同操作。

我还将在 Memo1.Text 中搜索,而不是逐行搜索,搜索可能位于行末并折到下一行的多个单词。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接