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;

Edit2 : Exemplo de dados Unicode:

?? ?? ???? ??? Se você busca apenas letras sem diacríticos ?? a palavra ?? costuma ser encontrada.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top