Convertir Salut-Ansi caractères Ascii équivalent (é -> e)
-
19-09-2019 - |
Question
Y at-il une routine disponible en Delphi 2007 pour convertir les caractères dans le haut de gamme de la table ANSI (> 127) à leurs proches équivalents en ASCII pur (<= 127) selon un lieu (codepage)?
Je sais que certains caractères ne peuvent pas traduire bien, mais la plupart peuvent, esp. dans la gamme 192-255:
- →
- →
- Ë → E
- ë → e
- C → C
- C → c
- - (en tiret) → - (trait d'union - qui peut être plus délicat)
- - (tiret em) → - (trait d'union)
La solution
WideCharToMultiByte cartographie plus-t ajustement pour tous les caractères qui ne sont pas supportés par le jeu de caractères spécifié, y compris les signes diacritiques de décapage. Vous pouvez faire exactement ce que vous voulez en utilisant cela et passer 20127 (US-ASCII) que la page de code.
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;
L'appel que vos exemples vous donne des résultats vous cherchez, y compris le cas emdash à moins que je ne pense pas est géré par la suggestion de Jeroen de se convertir à la forme D. Si Normalization vous ne voulez prendre que approche, Michael Kaplan a un billet de blog les diacritiques a expressément examiné stripping (plutôt que la normalisation en général), mais il utilise C # et une API qui a été introduit dans Vista. Vous pouvez obtenir quelque chose de similaire en utilisant la FoldString api (toute version Windows NT).
Bien sûr, si vous faites seulement cela pour un jeu de caractères, et vous voulez éviter les frais généraux de la conversion vers et à partir d'un WideString, Padu est exact qu'un simple boucle et une table de consultation serait tout aussi efficace.
Autres conseils
Juste pour prolonger la réponse de Craig pour Delphi 2009:
Si vous utilisez Delphi 2009 et plus récent, vous pouvez utiliser un code plus lisible avec le même résultat:
function OStripAccents(const aStr: String): String;
type
USASCIIString = type AnsiString(20127);//20127 = us ascii
begin
Result := String(USASCIIString(aStr));
end;
Malheureusement, ce code ne fonctionne que sur MS Windows. Sur Mac, les accents ne sont pas remplacés par des personnages les plus équipés mais par des points d'interrogation.
Il est évident que, Delphi utilise en interne WideCharToMultiByte sur Windows alors que sur Mac iconv est utilisé (voir LocaleCharsFromUnicode en System.pas). La question est de savoir si ce comportement différent sur différents OS doit être considéré comme bogue et signalé à CodeCentral.
Je crois que votre meilleur pari est de créer une table de recherche.
Ce que vous cherchez est la normalisation.
Michael Kaplan a écrit un bel article de blog sur la normalisation .
Il n'a pas immédiatement résoudre votre problème, mais vous pointe dans la bonne direction.
- jeroen