Konvertieren-Hi-Ansi-Zeichen für Ascii-äquivalent (é -> e)
Gibt es eine routine zur Verfügung, die in Delphi 2007 zu konvertieren die Zeichen in der großen Bandbreite der ANSI-Tabelle (>127) zu Ihrer Entsprechung in reinen ASCII - (<=127) entsprechend einem locale (codepage)?
Ich weiß, dass manche chars nicht gut übersetzen, aber die meisten können, insb. in der 192-255 Bereich:
- À → EINE
- à → eine
- Ë → E
- ë → e
- Ç → C
- ç → c
- – (en dash) → - (Bindestrich - das kann schwieriger)
- — (em dash) → - (Bindestrich)
Du musst angemeldet sein, um einen Kommentar abzugeben.
WideCharToMultiByte bietet best-fit-Zuordnung für jedes Zeichen, die nicht unterstützt werden, die von den angegebenen Zeichensatz, einschließlich Strippen, die diakritische Zeichen enthalten. Sie können genau das tun, was Sie wollen, indem Sie die Verwendung und Weitergabe 20127 (UNS-ASCII), wie Sie in der codepage.
Berufung, die Sie mit Ihren Beispielen produziert Ergebnisse, die Sie suchen, einschließlich der emdash-zu-minus-Fall, was ich nicht glaube, ist behandelt von Jeroen ' s Vorschlag zu konvertieren, um Normalization form D. Wenn Sie nicht wollen, dass die Vorgehensweise, Michael Kaplan hat eine blog-post die explizit beschreibt, Strippen diakritischen Zeichen (eher als Normalisierung im Allgemeinen), aber es nutzt C# und eine API, die war eingeführt in Vista. Sie können etwas ähnliches mit dem FoldString api (alle WinNT-Version).
Natürlich, wenn Sie nur tun dies für ein Zeichen gesetzt, und Sie wollen vermeiden, den Aufwand einer Konvertierung zu und von einem WideString, Padu ist richtig, dass eine einfache for-Schleife und eine lookup-Tabelle wäre genauso effektiv.
Nur zu verlängern Craig ' s Antwort für Delphi 2009:
Wenn Sie mit Delphi 2009 und neuer verwenden, können Sie einen besser lesbaren code, mit dem gleichen Ergebnis:
Leider, dieser code funktioniert nur unter MS Windows. Auf dem Mac die Umlaute werden nicht ersetzt durch best-Zeichen ausgestattet, sondern mit Fragezeichen.
Offensichtlich, Delphi intern verwendet WideCharToMultiByte auf Windows in der Erwägung, dass auf dem Mac "iconv" verwendet wird (siehe LocaleCharsFromUnicode im System.pas).
Die Frage ist, ob das unterschiedliche Verhalten auf verschiedenen OS sollte als Fehler und berichtete CodeCentral.
//TRANSLIT
option, aberLocaleCharsFromUnicode()
macht es nicht.Ich glaube, Ihre beste Wette ist, erstellen einer lookup-Tabelle.
Was du suchst ist die Normalisierung.
Michael Kaplan schrieb schöner blog-Artikel über Normalisierung.
Nicht sofort Ihr problem lösen, aber Punkte, die Sie in die richtige Richtung.
--jeroen
ÆÐØÞßæðøþ
, die zersetzen sich nicht und müssen behandelt werden manuell.