WideCharToMultiByte robi najlepiej dopasowanych mapowanie dla wszelkich znaków, które nie są obsługiwane przez określony zestaw znaków, w tym na usuwaniu znaków diakrytycznych. Możesz zrobić dokładnie to, co chcesz, używając tego i mijając 20127 (US-ASCII) jako stronę kodową.
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;
Wywołanie że ze swoimi przykładami produkuje wyniki szukasz, w tym przypadku emdash-do-minus, który nie sądzę, jest obsługiwane przez sugestię Jeroen do konwersji do normalizacji forma D. Jeśli tak chcąc przyjąć takie podejście, Michael Kaplan ma numer blog post, który wyraźnie omawia usuwanie znaków diakrytycznych (zamiast normalizacji w ogóle), ale używa C# i API, który został wprowadzony w systemie Vista. Możesz uzyskać coś podobnego za pomocą aplikacji FoldString api (dowolne wydanie WinNT).
Oczywiście, jeśli robisz to tylko dla jednego zestawu znaków, i chcesz uniknąć kosztów związanych z konwersją do iz WideString, Padu ma rację, że prosta pętla for i tabela odnośników byłyby równie skuteczne .
Dzięki Craig. To bardziej ogólne rozwiązanie niż wyszukiwanie. Miał literówkę w magicznej liczbie, więc poprawiłem ją i użyłem stałej. W każdym razie działa na D2007 i D2009. –
Jedną z rzeczy, które zauważyliśmy, jest to, że "β" (Unicode 1E9E latin capital letter sharp s) nie jest konwertowane, więc robimy to wcześniej: StringReplace (astr, "β", "SS", [rfReplaceAll]) – PatrickvL