Delphi 2009: Buscar diacríticos pular em utf-8 unicode
Pergunta
Estou tendo arquivo codificado utf-8, contendo texto árabe e eu tenho que procurar-lo.
Meu problema são sinais diacríticos, como procurar ignorá-los?
Como se você carregar esse texto no Internet Explorer (conversão de texto em HTML é claro), IE está ignorando esses sinais diacríticos?
Qualquer ajuda?
Edit1 : Pesquisa é simplesmente realizada por código a seguir:
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;
?? ?? ???? ??? Se você busca apenas letras sem diacríticos ?? a palavra ?? costuma ser encontrada.
Solução
Eu acho que os sinais diacríticos não são o único problema.
Eu faria substituições de caracteres, substituindo-os por cordas vazias, eu também normalizar o texto '?' '?' '?' são todos convertidos em '?', e também fazer o mesmo para ? ? ? ? ? ? ? ...
Para procurar Eu também usar um stemmer luz como o "khoja stemmer" (fonte Java aqui )
A maneira mais avançada é fazê-lo como TREC :
- Remover pontuação
- Remover diacríticos (principalmente em vogais fracas) A maior parte da corpus não continham vogais fracas.
- Algumas das entradas do dicionário continha vogais fracas. Isso fez com que tudo consistente.
- Remover não letras
- Substitua inicial ? ou ? com alif nua .?
- Substitua ? com ?
- Substitua a seqüência ?? com ?
- Substitua ? com ? última
- Substitua ? com ? última
- Faixa de 6 prefixos: artigos definidos (??? ???, ???, ???, ??,) e ? (E) desde o início de palavras normalizados
- Faixa de 10 sufixos das extremidades palavras ?? ??, ??, ? ?, ?, ??, ??, ??, ??
eu iria indexar o texto por este texto modificado (para memorandos eu armazenar o índice da palavra no texto original), e fazer a mesma coisa para a consulta de pesquisa.
Eu também iria procurar em Memo1.Text e não as linhas de um por um, a busca pode ser por várias palavras que podem ser no final de uma linha e embrulhadas para a próxima linha.
Outras dicas
No Vista + provavelmente você pode (eu não tenho experiência com o árabe) use CompareString com opção LINGUISTIC_IGNOREDIACRITIC.
NORM_IGNORENONSPACE também pode ajudar. Então, novamente, não pode .
Como alternativa (mas eu estou apenas supondo), você pode ser capaz de analisar suas cordas com GetStringTypeEx e remover manualmente diacríticos. Provavelmente, você teria que chamar FoldString ou MultiByteToWideChar com MAP_COMPOSITE bandeira pela primeira vez.