utf8 u00fa tabla interrogacion especiales caracteres acentos delphi character-encoding ascii delphi-2007 non-ascii-characters

delphi - u00fa - á en utf 8



Convierte los caracteres de Hi-Ansi a Ascii equivalente(é-> e) (4)

Creo que su mejor opción es crear una tabla de búsqueda.

¿Existe una rutina disponible en Delphi 2007 para convertir los caracteres en el rango alto de la tabla ANSI (> 127) a sus equivalentes en ASCII puro (<= 127) según una configuración regional (página de códigos)?

Sé que algunos caracteres no se pueden traducir bien, pero la mayoría sí, especialmente. en el rango 192-255:

  • ÀA
  • àa
  • ËE
  • ëe
  • ÇC
  • çc
  • - (en dash)- (guión - eso puede ser más complicado)
  • - (em dash)- (guion)


Solo para extender la respuesta de Craig para Delphi 2009:

Si usa Delphi 2009 y versiones posteriores, puede usar un código más legible con el mismo resultado:

function OStripAccents(const aStr: String): String; type USASCIIString = type AnsiString(20127);//20127 = us ascii begin Result := String(USASCIIString(aStr)); end;

Desafortunadamente, este código solo funciona en MS Windows. En Mac, los acentos no se reemplazan por caracteres mejor ajustados, sino por signos de interrogación.

Obviamente, Delphi usa internamente WideCharToMultiByte en Windows, mientras que en Mac se usa iconv (vea LocaleCharsFromUnicode en System.pas). La pregunta es si este comportamiento diferente en diferentes sistemas operativos se debe considerar como un error y se debe informar a CodeCentral.


WideCharToMultiByte es el que mejor se adapta a los caracteres que no son compatibles con el conjunto de caracteres especificado, incluidos los signos diacríticos. 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;

Llamar eso con tus ejemplos produce los resultados que estás buscando, incluido el caso emdash-to-minus, que no creo que sea manejado por la sugerencia de Jeroen de convertir a la forma de normalización D. Si querías tomar ese enfoque, Michael Kaplan tiene una publicación en el blog 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 está haciendo esto para un juego de caracteres, y desea evitar que la sobrecarga se convierta en un WideString, Padu está en lo cierto al decir que un bucle simple y una tabla de búsqueda serían igual de efectivos.