Frage

Ich bin mit utf-8-codierter Datei arabischen Text enthalten, und ich habe es zu suchen.

Mein Problem sind diakritische Zeichen, wie man sucht sich das Überspringen?

Wie, wenn Sie diesen Text im Internet Explorer geladen werden (ofcourse Text im HTML-Konvertierung), wird IE diese diakritischen Zeichen Überspringen?

Jede Hilfe?

Edit1 : Die Suche wird einfach durch folgenden Code ausgeführt werden:

 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 : Beispiel für Unicode-Daten:

قل هو الله أحد Wenn Sie nur Buchstaben ohne Umlaute قل das Wort suchen قل wird nicht gefunden werden.

War es hilfreich?

Lösung

Ich finde, dass diakritische Zeichen sind nicht das einzige Problem.

Ich würde Charakter Ersatz tun, so dass sie durch leere Strings zu ersetzen, würde ich auch den Text normalisieren ‚أ‘ ‚إ‘ ‚آ‘ werden alle konvertiert ‚ا‘, und auch das Gleiche tun für ى ئ ي ؤ و ة ه ...

Für die Suche Ich würde auch ein Licht stemmer wie die "Khoja stemmer" (Java-Quellcode verwenden TREC zu tun:

  • Entfernen Interpunktion
  • Entfernen diakritische Zeichen (vor allem schwache Vokale) Die meisten der Korpus enthielten keine schwache Vokale.
  • Einige der Wörterbucheinträge enthalten schwache Vokale. Das machte alles konsistent.
  • Entfernen nicht Buchstaben
  • Ersetzen anfängliches إ oder أ mit bloßer alif .ا
  • replace آ mit ا
  • Ersetzen Sie die Sequenz ىء mit ئ
  • Ersetzen final ى mit ي
  • Ersetzen final ة mit ه
  • Streifen 6 Präfixe: bestimmte Artikel (فال آال, بال, وال, ال,) und و (Und) von den Anfängen der normalisierten Wörter
  • Streifen 10 Suffixe von den Enden der Worte ات ان, ها, ي ة, ه, ية, يه, ين, ون

Ich würde Index den Text von diesem modifizierten Text, und das Gleiche tun, was für die Suchabfrage (für Notizen ich den Index des Wortes im Originaltext speichern würde).

Ich würde auch in Memo1.Text suchen und nicht die Zeilen eins nach dem anderen, könnte die Suche nach mehreren Wörtern, die in die nächste Zeile am Ende einer Zeile und gewickelt werden können.

Andere Tipps

Auf Vista + Sie können sich wahrscheinlich (ich habe keine Erfahrung mit Arabisch) verwenden CompareString mit Option LINGUISTIC_IGNOREDIACRITIC.

NORM_IGNORENONSPACE kann auch helfen. Dann wieder, es nicht kann .

Als Alternative (aber ich vermute nur) Sie können in der Lage sein, um die Saiten mit GetStringTypeEx und manuell diakritische Zeichen entfernen. Wahrscheinlich würden Sie anrufen müssen FoldString oder MultiByteToWideChar mit Flagge MAP_COMPOSITE zuerst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top