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)
War es hilfreich?

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.

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