德尔福2009:在 unicode utf-8 中搜索跳过变音符号
题
我有包含阿拉伯文本的 utf-8 编码文件,我必须搜索它。
我的问题是变音符号,如何跳过它们进行搜索?
就像如果您在 Internet Explorer 中加载该文本(当然是在 HTML 中转换文本)一样,IE 会跳过这些变音符号吗?
有什么帮助吗?
编辑1: :搜索只需通过以下代码执行:
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;
编辑2: :unicode 数据示例:
如果您只搜索没有任何变化的字母,则找不到字母。
解决方案
我发现变音符号并不是唯一的问题。
我会进行字符替换,用空字符串替换它们,我还会将文本 'Í' 'Í' 'â' 标准化,全部转换为 'ā',并且对 ى æ и ٤ ه 也执行相同操作。 。
对于搜索,我还会使用轻量词干分析器,例如“khoja 词干分析器”(Java 源 这里)
更高级的方法是这样做 特雷克:
- 删除标点符号
- 删除变音符号(主要是弱元音) 大部分语料库不包含弱元音。
- 一些字典条目包含弱元音。这使得一切都一致。
- 删除非字母
- 将首字母 Í 或 Í 替换为裸 alif .ā
- 将 à 替换为 ā
- 将序列 ى١ 替换为 ٛ
- 将最后的 ى 替换为 ey
- 将最后的 É 替换为 ه
- 去掉 6 个前缀:确定的文章(forking of norker of stropernings)
- 删除单词末尾的 10 个后缀 সইা ইইা ইসারা সা সা
我将通过修改后的文本对文本进行索引(对于备忘录,我将在原始文本中存储单词的索引),并对搜索查询执行相同的操作。
我还会在 Memo1.Text 中搜索,而不是逐行搜索,搜索可能是位于行末尾并换行到下一行的多个单词。
其他提示
在Vista +你也许可以(我有阿拉伯语没有经验)使用 CompareString 的与选项LINGUISTIC_IGNOREDIACRITIC。
NORM_IGNORENONSPACE还可能有帮助。话又说回来,它可能不会的
另外的(但我只是猜测),你可以用的 GetStringTypeEx 和手动删除变音符号。也许你不得不调用 FoldString 或的的MultiByteToWideChar 与标志MAP_COMPOSITE第一
不隶属于 StackOverflow