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)
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top