WideCharToMultiByte hace mapeo de mejor ajuste de los caracteres que no son compatibles con el juego de caracteres especificado, incluyendo diacríticos de desbroce. Puede hacer exactamente lo que quiera utilizando eso y pasando 20127 (US-ASCII) como la página de códigos.
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;
Llamando que con sus ejemplos produce resultados que usted está buscando, incluyendo el caso-emdash-a menos, que no creo que es manejado por la sugerencia de Jeroen para convertir al formulario de normalización D. Si lo hizo quiero tomar ese enfoque, Michael Kaplan tiene un blog post que discute explícitamente los signos diacríticos (en lugar de la normalización en general), pero usa C# y una API que se introdujo en Vista. Puede obtener algo similar utilizando la API FoldString (cualquier versión de WinNT).
Por supuesto, si solo hace esto para un juego de caracteres, y desea evitar que la sobrecarga se convierta en WideString, Padu está en lo cierto al decir que un bucle simple y una tabla de búsqueda serían igual de efectivos .
Gracias Craig. Esa es una solución más genérica que la búsqueda. Tenía un error ortográfico en el número mágico, así que lo corrigí y usé una constante en su lugar. Pero de todos modos, funciona tanto en D2007 como en D2009. –
Una cosa que notamos con esto, es que 'β' (unicode 1E9E letra mayúscula latina s) no se convierte, por lo que hacemos esto de antemano: StringReplace (aStr, 'β', 'SS', [rfReplaceAll]) – PatrickvL