ventajas - Manejo de una cadena Unicode en las versiones de Delphi<= 2007
lenguaje de programacion delphi ventajas y desventajas (5)
Antecedentes: esta pregunta se relaciona con las versiones de Delphi por debajo de 2009 (es decir, sin soporte integrado de Unicode). Tengo una especificación que me obliga a transmitir una cadena codificada en Unicode a través de una conexión TCP, pero no tengo Delphi 2009.
Pregunta: ¿Existe una sola función o una biblioteca muy pequeña (no necesito demasiado volumen) que pueda usar para codificar una sola cadena en UTF-8 inmediatamente antes de enviar por el cable? Como segunda parte de mi pregunta: si hay cadenas codificadas en UTF-8 enviadas como respuesta, creo que necesitaría otra función para volver a tener un formato de cadena Delphi. Entiendo las limitaciones de tal soporte Unicode de esta manera.
Convertir una aplicación previa a Delphi 2009 en unicode es difícil pero factible. Lo dividiría en 3 tareas.
- Primero, asegúrese de que su base de datos maneje cadenas de caracteres unicode. Preferiblemente soporte UTF-16. Asegúrate de que todo el código de tu base de datos maneje correctamente las cadenas extensibles, y los controladores que estás usando manejan esto también.
- Convierta toda su lógica de negocio de usar cadenas a usar WideStrings. Es muy fácil omitir algunos, y no obtendrá ningún error, ya que el compilador convertirá implícitamente la cadena de caracteres a cadena si olvida algún método. También asegúrese de cambiar todas las funciones de cadena estándar a equivalentes WideString. Este proceso debe extenderse a cualquier componente de la tercera parte que pueda usar.
- La parte final es cambiar los componentes visuales estándares y de terceros que pueda tener a los equivalentes de WideString. Esto debe hacerse siempre que muestre cadenas que pueden contener caracteres Unicode.
Además de todo eso, asegúrese de que las pruebas sean minuciosas y use caracteres unicode que realmente utilicen el byte alto. Si solo prueba utilizando el juego de caracteres latinos, perderá errores.
Creé una aplicación Unicode completa sin usar Delphi 2009 (antes de su lanzamiento).
He usado lo siguiente:
Use la cadena ancha como el tipo de datos de cadena principal.
Componente de base de datos usado con soporte unicode (ADO también usa cadena ancha, pero no lo utilicé porque no maneja nombres de campo unicode).
Usó TNTControls gratis para la interfaz de usuario, funcionó bien, pero es lo mismo que los controles estándar, no tiene muchas características como los controles de terceros.
Configuré una máquina virtual con otro idioma, por lo que puedo probar la versión en un sistema diferente que no es compatible con mi idioma.
FastReport fue mi herramienta de informes que también admite Unicode.
también he usado DIConverters de Delphi Inspiration para convertir una base de datos de ansi a UTI8 con sus funciones, puedes usarla para la conversión de / a UTF8, y es freeware ;-)
también hay un proyecto de fuente abierta, los fundamentos de Delphi , que tienen una función de uso para Unicode.
pero creo que si pudieras usar D2009 para unicode de soporte completo, tu trabajo será mucho más fácil y rápido, porque no usarás un tipo de datos de banda ancha lenta, y encontrarás que la mayoría de los terceros ofrecieron una versión Unicode o están trabajando ahora en eso.
Si todo lo que tiene que hacer es convertir las cadenas internas del programa de la codificación del sistema a UTF-8 y viceversa, entonces use las funciones de la biblioteca que mencionó Uwe Raabe. Si todavía está en Delphi 4 o 5 (que no tienen esas funciones), puede usar las funciones que están en GNU gettext para Delphi .
Y no deje que todas las respuestas sobre ir completamente WideString le asuste - utilizando UTF-8 como la codificación para el intercambio de datos (así entiendo su pregunta) debería ser posible en un programa Ansi Delphi normal sin grandes problemas, siempre y cuando está tratando con datos que son 100% representables en su codificación de Windows.
Las versiones de Delphi anteriores a Delphi 2009 sí tienen incorporado el soporte Unicode. El tipo WideString
ha estado disponible desde Delphi 4, creo, quizás antes. WideString
no es tan agradable como el nuevo tipo UnicodeString
, pero aún contiene caracteres Unicode de 16 bits, y puede convertirlo a PWideChar
para enviar cadenas a las funciones de la API Unicode. La unidad de Windows
declara la mayoría de las versiones "anchas" de las funciones de la API, y no hay nada que le impida declarar otras funciones usted mismo si encuentra que faltan algunas.
Lo que las versiones anteriores no tienen es la compatibilidad con Unicode en el VCL. Para eso, puedes usar los controles Tnt Unicode . Solían ser gratis Parece que hay algunos lugares donde todavía está disponible la última versión gratuita: (1) , (2) .
El JCL tiene un par de unidades para trabajar con Unicode. La unidad JclWideStrings
tiene funciones de utilidad casi livianas. La unidad JclUnicode
es más completa, pero también incluye un recurso considerable para determinar las propiedades de los caracteres de todos los caracteres Unicode.
Con el JCL, tiene algunas opciones para que las clases tengan listas de valores de WideString
. Creo que Delphi 7 incluso viene con una clase para eso.
No piense que solo porque no tiene Delphi 2009 no puede escribir un programa Unicode.
Si tiene un valor WideString
y desea codificarlo como UTF-8, llame a la función Utf8Encode
. AnsiString
un valor AnsiString
, o posiblemente Utf8String
, si su versión Delphi declara ese tipo. Sin embargo, no es lo mismo que el tipo Utf8String
Delphi 2009. Delphi 2009 se convertirá automáticamente a UnicodeString
o AnsiString(x)
y viceversa en las declaraciones de asignación. Las versiones anteriores solo tienen un tipo de AnsiString
, por lo que debe realizar un seguimiento de las variables que contienen datos UTF-8 y que contienen datos Ansi. (La notación húngara en sus nombres de variables y parámetros puede ayudarlo a realizar un seguimiento.) Y, por supuesto, también hay una función Utf8Decode
para convertir datos UTF-8 a WideString
.
Para manejar otras codificaciones de caracteres, debe verificar Open XML , una biblioteca XML gratuita para Delphi. Como parte de su manejo de XML, tiene soporte para convertir entre 70 codificaciones diferentes.
Utilice el tipo de cadena ancha y funciones de codificación a / desde utf8 (UTF8Encode / UTF8Decode)
No use el tipo de cadena y no use las funciones Ansi: si lo hace, está perdiendo información.