2011-02-08 20 views
8

estoy actualizando alguna antigua (de 2003) de código de Delphi a Delphi XE Arquitecto y estoy corriendo con algunos problemas. Estoy recibiendo una serie de errores donde hay tipos incompatibles. Estos errores no ocurren en Delphi 6, así que debo suponer que esto se debe a que las cosas se han actualizado.¿Cuál es la diferencia entre WideChar y AnsiChar?

Sinceramente, no sé cuál es la diferencia entre PAnsiChar y PWideChar es, pero Delphi seguro que sabe la diferencia y no me deja de compilación. Si supiera cuáles eran las diferencias, tal vez podría averiguar qué usar o cómo solucionarlo. Hace

+0

Parece que puedo haber respondido a mi propia pregunta. AnsiChar solo tiene [0 ... 255] mientras que WideChar tiene [0 ... 65,535]. Supongo que WideChar es unicode o algo así. – Daisetsu

+0

La actualización de Unicode en D2009 fue una gran mejora silenciosa ... Debe ir cuidadosamente a través de su código y verificar los tipos de cadena. Si usa el tipo de datos general 'String' y' Char', entonces todo debería correlacionarse correctamente con el tipo de cadena correcto ... –

Respuesta

18

El corto: antes de Delphi 2009, el tipo de cuerda nativa en Delphi solía ser ANSI CHAR: cada carácter en cada cuerda se representaba como un carácter de 8 bits. A partir de cadenas Delphi 2009 de Delphi se convirtió en UNICODE, usando la notación UTF-16: Ahora el Char básica utiliza 16 bits de datos (2 bytes), y es probable que no necesita saber mucho acerca de los puntos de código Unicode que se representan como dos caracteres consecutivos de 16 bits.

Los caracteres de 8 bits se denominan "ANSI Caracteres". Un PAnsiChar es un puntero a caracteres de 8 bits. Los caracteres de 16 bits se llaman "Caracteres anchos". Un PWideChar es un puntero a caracteres de 16 bits. ¡Delphi sabe la diferencia y le va bien si no le permite mezclar los dos!

Más información

Aquí hay un enlace populares en Unicode: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

Usted puede encontrar más información sobre la migración de Delphi a Unicode aquí: New White Paper: Delphi Unicode Migration for Mere Mortals

También puede buscar SO para "Delphi Migración Unicode ".

9

un par de años, el tipo de caracteres por defecto en Delphi fue cambiado de (variable de un solo byte que representa un carácter ANSI) AnsiChar a WideChar (dos bytes variable que representa un personaje UTF16.) El tipo char es ahora un alias para WideChar en lugar de AnsiChar, el tipo string es ahora un alias para UnicodeString (una versión Unicode UTF-16 de tipo de cadena tradicional de Delphi) en lugar de AnsiString, y el tipo PChar ahora es un alias para PWideChar en lugar de PAnsiChar.

El compilador puede hacerse cargo de muchas de las conversiones en sí, pero hay algunos problemas:

  1. Si está utilizando tipos de cadena de puntero, como PChar, es necesario asegurarse de que su el puntero apunta al tipo correcto de datos, y el compilador no siempre puede verificar esto.
  2. Si va a ceder a las cadenas var parámetros, el tipo de variable tiene que ser exactamente la misma. Esto puede ser más complicado ahora que tiene dos tipos de cadenas para tratar.
  3. Si está utilizando string como un conveniente búfer de matriz de bytes para almacenar datos arbitrarios en lugar de una variable que contiene texto, eso no funcionará como UnicodeString. Asegúrese de que se declaren como RawByteString como una solución alternativa.
  4. En cualquier lugar que está tratando con longitudes de cadena de bytes, por ejemplo, al leer o escribir a/desde un TStream, asegúrese de que su código no está asumiendo que un char es un byte de longitud.

Eche un vistazo a Delphi Unicode Migration for Mere Mortals para obtener más trucos y consejos sobre cómo hacer que esto funcione. No es tan difícil como suena, pero tampoco es trivial. ¡Buena suerte!

Cuestiones relacionadas