2011-05-18 31 views
10

Finalmente me actualicé a Delphi XE. Tengo una biblioteca de unidades donde utilizo cadenas para almacenar caracteres ANSI (caracteres entre A y U). Estoy 100% seguro de que nunca usaré caracteres UNICODE en esos lugares.Delphi XE - ¿Debería usar String o AnsiString?

Quiero convertir todas las demás bibliotecas a Unicode, pero para esta biblioteca específica creo que será mejor seguir con ANSI. La ventaja es el requisito de memoria, ya que en algunos casos cargué archivos TXT muy grandes (que contienen SOLO caracteres Ansi). La desventaja podría ser que tengo que hacer muchos y muchos tipos de difusión cuando hago que esas bibliotecas interactúen con bibliotecas normales (Unicode).

Hay algunas pautas generales para mostrar cuándo es bueno convertir a Unicode y cuándo seguir con Ansi?

Respuesta

7

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.

+0

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

3

En general, solo use AnsiString si es importante que los Chars sean bytes únicos. De lo contrario, el uso de una cadena garantiza la futura compatibilidad con Unicode.

0

Es necesario comprobar todas las bibliotecas de todos modos porque todas las funciones de la API de Windows en Delhpi XE reemplazados por sus análogos Unicode, etc. Si usted nunca va a usar Unicode es necesario utilizar Delphi 7.

+1

Delphi 2007 funcionará bien si no es necesario Unicode y es mucho más arriba-hasta la fecha. – Johan

+0

Yo no dije que no utilizan Unicode (a pesar de que es verdad, no me importa que gran parte de ella). Utilizo cadenas ANSI SOLAMENTE para esta biblioteca específica porque uso un alfabeto reducido y necesito cadenas pequeñas para disminuir los requisitos de memoria. – Ampere

4

Usted debe ser capaz de finalice la conversión en la interfaz entre esta unidad y sus clientes. Usa AnsiString internamente y ensarta en cualquier otro lugar y deberías estar bien.

+0

@Altar - Creo que David lo ha resumido muy bien (por lo general lo hace). Y no estoy seguro de por qué se necesita 'montones y montones de typecasts' si ha discreto interfaces bien diseñados para el acceso a los datos del ANSI - sólo tiene que utilizar System.StringToWideChar en funciones en el umbral entre ANSI y Unicode - ver ms-help: //embarcadero.rs_xe/vcl/System.StringToWideChar.html en XE ayuda "Devuelve una cadena Unicode de un AnsiString." HTH MN – Vector

+0

@mikey o incluso más sencillo simplemente UnicodeString (s) –

+0

sé - que es lo que yo mismo y nunca he tenido un problema - pero ya que no hay una función VCL documentado, pensé que tiene más peso ...: -) – Vector

0

Utilice AnsiString explícitamente en todas partes de esta unidad y obtendrá los errores de advertencia del compilador (que nunca debe ignorar) para los errores de conversión String a AnsiString si accede a las rutinas incorrectamente.

Alternativamente, tal vez preferiblemente dependiendo de su situación, simplemente convierta todo a UTF8.

0

Pegue con cadenas Ansi SÓLO si no tiene el tiempo para convertir el código correctamente. El uso de cadenas de Ansi es realmente solo para compatibilidad con versiones anteriores: por lo que sé, C# no tiene cadenas equiavalentes a Ansi. De lo contrario, use las cadenas estándar Unicode. Si miras en mi sitio web, tengo una unidad de rutinas de cadenas completas (alrededor de 5.000 LOC) que funciona con Delphi 2007 (no Uniocde) y XE (Unicode) con solo interfaces de "cadena" y contiene casi todas las problemas de conversión que pueda enfrentar.

+0

"El uso de cadenas ANSI es realmente sólo para la compatibilidad hacia atrás" - - - en realidad, en mi caso es para los requisitos de memoria. ¡UNICODE hará que mi programa requiera 2 veces más RAM! Esto superará el límite de las computadoras normales (2-4GB RAM) de hoy. Todas las demás bibliotecas mías ya se han convertido a UNICODE. – Ampere

Cuestiones relacionadas