Konvertieren Hallo-Ansi Zeichen entspricht Ascii (é -> e)
-
19-09-2019 - |
Frage
Gibt es eine Routine in Delphi 2007 die Zeichen im hohen Bereich der ANSI-Tabelle (> 127) in den entsprechenden diejenigen in reiner ASCII (<= 127) nach einem locale (Codepage) zu konvertieren?
Ich weiß, dass einige Zeichen kann auch nicht übersetzen, aber die meisten können, esp. im 192-255 Bereich:
- → A
- → a
- E → E
- E → e
- Ç → C
- ç → c
- - (en Bindestrich) → - (Bindestrich - die knifflige sein kann)
- - (em dash) → - (Bindestrich)
Lösung
WideCharToMultiByte tut Best-Fit-Mapping für alle Zeichen, die von dem spezifizierten Zeichensatz unterstützt, einschließlich Abstreifen diakritische Zeichen nicht. Sie können genau das tun, was Sie wollen durch die und vorbei 20127 (US-ASCII) als Zeichensatz verwendet wird.
function BestFit(const AInput: AnsiString): AnsiString;
const
CodePage = 20127; //20127 = us-ascii
var
WS: WideString;
begin
WS := WideString(AInput);
SetLength(Result, WideCharToMultiByte(CodePage, 0, PWideChar(WS),
Length(WS), nil, 0, nil, nil));
WideCharToMultiByte(CodePage, 0, PWideChar(WS), Length(WS),
PAnsiChar(Result), Length(Result), nil, nil);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(BestFit('aÀàËëÇç–—€¢Š'));
end;
Der Aufruf, dass mit Ihrer Beispiele produziert Ergebnisse, die Sie suchen, einschließlich der endash-to-Minus-Fall, der glaube ich nicht von Jeroen Vorschlag behandelt wird Normalisierungs Form D. zu konvertieren Wenn Sie nehmen wollte, dass Ansatz hat Michael Kaplan einen Blogeintrag rel="noreferrer"> die expliziten Strippen diakritische bespricht (eher im allgemeinen als Normalisierung), aber es nutzt C # und eine API, die in einleitet Vista war. Sie können etwas ähnliches mit dem FoldString api (jedem WinNT release) erhalten.
Natürlich, wenn Sie nur diesen Zeichensatz für einen tun, und Sie wollen den Aufwand zu vermeiden, die Umwandlung zu und von einem Wide ist Padu richtig, dass ein einfache for-Schleife und eine Lookup-Tabelle genauso effektiv sein würde.
Andere Tipps
Just Craig Antwort für Delphi 2009 zu verlängern:
Wenn Sie Delphi 2009 und neuere, können Sie einen lesbaren Code mit dem gleichen Ergebnis verwendet werden:
function OStripAccents(const aStr: String): String;
type
USASCIIString = type AnsiString(20127);//20127 = us ascii
begin
Result := String(USASCIIString(aStr));
end;
Leider funktioniert dieser Code funktioniert nur auf MS Windows. Auf dem Mac werden die Akzente nicht am besten passende Zeichen ersetzt, sondern durch Fragezeichen.
Offensichtlich Delphi intern verwendet WideCharToMultiByte unter Windows während auf Mac iconv verwendet wird (siehe LocaleCharsFromUnicode in System.pas). Die Frage ist, ob dies ein anderes Verhalten auf verschiedenen OS sollte als Fehler und berichtete Codecentral in Betracht gezogen werden.
Ich glaube, die beste Wahl eine Lookup-Tabelle erstellt wird.
Was Sie suchen ist die Normalisierung.
Michael Kaplan hat einen schönen Blog Artikel über Normalisierung .
Es ist nicht sofort lösen Ihr Problem, aber Punkte, die Sie in die richtige Richtung.
- jeroen