El problema con las pautas generales es que algo como esto puede ser muy específico para la situación de una persona. Tu ejemplo aquí es uno de esos.
Sin embargo, para las personas que llegan aquí y Googling, algunas pautas generales son:
Sí, convertir a Unicode. No intente mantener una aplicación antigua completamente usando AnsiString
s. La razón es que toda la VCL es Unicode, y no debe intentar mezclar las dos, porque convertirá cada vez que asigne una cadena Unicode a una cadena ANSI, y esa es una conversión con pérdida. Tratar de mantener el camino anterior porque es menos trabajo (o alguna razón similar) le causará dolor; abrace el nuevo tipo string
, conviértalo e impleméntelo.
En lugar de mezclar aleatoriamente los dos, realice explícitamente las conversiones que necesite, una vez, por ejemplo, si está cargando datos de una versión anterior de su programa, sabe que será ANSI, así que léalo en un La cadena Unicode allí, y eso es todo. Para siempre, será Unicode.
No debería necesitar cambiar el tipo de sus variables string
- string
pre-D2009 es ANSI, y en D2009 y alter es Unicode. En su lugar, siga compiler warnings y mire qué métodos de cadena utiliza, algunos aún toman un parámetro AnsiString
y lo encuentro todo confuso. El compilador te dirá.
Si usa cadenas para contener bytes (en otras palabras, utilizándolas como una matriz de bytes porque un carácter era un byte) cambie a TBytes
.
Puede encontrar problemas específicos para cosas como el cifrado (las cadenas ya no son byte/caracteres, por lo que 'character' para 'character' puede obtener un resultado diferente); leer archivos de texto (use las clases de flujo y TEncoding); y, francamente, cosas misceláneas. Busque aquí en SO, la mayoría de las cosas se han preguntado antes.
comentaristas, por favor añadir más sugerencias ... Yo sobre todo utilizar C++ Builder, Delphi no, y es probable que haya bastantes cosas específicas para Delphi que no conozco acerca.
Ahora para su pregunta específica: ¿Debería convertir esta biblioteca?
Si:
- Los valores entre A y T son realmente sólo alguna vez en este rango, y
- Estos valores representan caracteres (A Realmente es una, no el valor de bytes 65 - si es así, el uso Tbytes), y
- Usted carga grandes archivos de texto y la memoria es un problema
entonces no convertir a Unicode, y en lugar de cambiar sus string
s a AnsiString
s, tiene sentido.
Tenga en cuenta que:
- Hay una sobrecarga cada vez que convierta de ANSI a Unicode
- usted podría utilizar
UTF8String
, que es un tipo específico de AnsiString
que no será con pérdidas cuando se convierte, y aún almacenará la mayoría de los textos (caracteres romanos) en un solo byte
- Cambiar todas las instancias de
string
a podría ser un poco trabajoso, y deberá verificar todos los métodos invocados para ver si hay demasiadas conversiones implícitas se están realizando med (para rendimiento), etc.
- Puede necesitar cambiar la capa externa de su biblioteca para usar Unicode para que el código de conversión o las advertencias ANSI/Unicode no sean visibles para los usuarios de su biblioteca
- Si convierte a Unicode , conjuntos de caracteres (no se puede recordar la sintaxis, tal vez
if 'S' in MySet
?) won't work. De su descripción de los caracteres A a U, podría suponer que desea utilizar esta sintaxis.
Mi recomendación? Personalmente, la única razón por la que haría esto con la información que me ha dado es el uso de la memoria, y posiblemente el rendimiento, dependiendo de lo que esté haciendo con esta gran cantidad de A..U
s.Si eso es realmente significativo, es tanto el controlador como la restricción, y debe convertir a ANSI.
Gracias David. Empecé a convertir esta biblioteca a Ansi y tiene sentido. También veo que la interacción entre esta biblioteca y otra biblioteca clásica (Unicode) no es tan grande como temía. Sobre todo tengo que 'imprimir' esas cadenas A-U en un lienzo. Lástima que no haya tenido la idea con UTF8String antes. Ya comencé mi conversión. PERO si veo problemas, definitivamente lo pensaré. Gracias de nuevo. – Ampere