delphi 2009 unicode + problema ansi
-
05-07-2019 - |
Pregunta
Estoy portando una aplicación isapi (pageproducers) de delphi 7 a delphi 2009, las páginas se basan en archivos html en UTF8.
Todo va bien, excepto cuando se activa Onhtmltag y reemplazo una etiqueta transparente con cualquier valor con caracteres especiales como caracteres acentuados (áé ...) Esos caracteres se reemplazan en la salida con un & # 65533; personaje.
¿Qué pasa?
Solución
Como parte de su procedimiento de depuración, debe averiguar exactamente qué valor (es) de bytes recibe el navegador para el carácter de signo de interrogación.
Como debe saber, el tipo de cadena de Delphi 2009 es Unicode, mientras que todas las versiones anteriores eran ANSI. Delphi 7 introdujo el tipo Utf8String
, pero Delphi 2009 hizo ese tipo especial. Si no está utilizando ese tipo para mantener cadenas codificadas como UTF-8, entonces debería comenzar a hacerlo. Los valores almacenados en las variables Utf8String
se convertirán a los valores de UnicodeString
automáticamente cuando asigne uno a otro.
Si está almacenando sus cadenas codificadas con UTF-8 en variables ordinarias AnsiString
, se convertirán a Unicode utilizando la página de códigos del sistema predeterminada si las asigna a un UnicodeString
. Eso no es lo que quieres.
Si está asignando literales codificados con UTF-8 a variables de tipo string
, deténgalo. Ese tipo espera que sus valores se codifiquen como UTF-16, al igual que WideString
siempre lo ha hecho.
Si está cargando sus archivos en un descendiente de TStrings
con LoadFromFile
, entonces debe comenzar a usar el segundo parámetro de ese método, que le indica qué codificación usar. Los archivos codificados con UTF-8 deben usar TEncoding.UTF8
. El valor predeterminado es TEncoding.Unicode
, que es little-endian UTF-16.
Otros consejos
Este es probablemente un problema de codificación de caracteres.
El IDE de Delphi generalmente usa Windows-1252 o UTF-16 para codificar el código fuente. HTML a menudo utiliza UTF-8.
Probablemente necesites algo de transliteración entre esas codificaciones. Para eso, debe averiguar qué codificaciones se utilizan exactamente (como Rob menciones).
O revertir a HTML con caracteres acentuados que se escapan (como menciones Ralph )
¿Puedes publicar una aplicación pequeña que muestre el problema? (Puede enviarme un correo electrónico sobre cualquier cosa que tenga jeroen en el nombre de usuario y pluimers.com en el nombre de dominio llegará a mi buzón).
--jeroen
Gracias por su ayuda, después de algunas pruebas, el problema era muy simple (o también estúpido)
response.contenttype := 'text/html charset=UTF-8'
No es necesario traducir manualmente entre unicodesting utf8string ansistring widestring. El uso de cadenas de Delphi 2009 es casi perfecto.