2009-01-03 9 views
14

Exactamente eso: ¿la longitud de una cadena es igual al tamaño del byte? ¿Importa en el idioma?¿La longitud de una cadena es igual al tamaño del byte?

Creo que sí, pero solo quiero asegurarme.

Información adicional: Me pregunto en general. Mi situación específica era PHP con MySQL.

Como la respuesta es no, eso es todo lo que necesito saber.

Respuesta

46

No. Una cadena terminada en cero tiene un byte extra. Una cadena pascal (Delphi shortstring) tiene un byte extra para la longitud. Y las cadenas Unicode tienen más de un byte por carácter.

Por unicode, depende de la codificación. Podría ser de 2 o 4 bytes por carácter o incluso una mezcla de 1,2 y 4 bytes.

+0

En Delphi shortstring tiene un byte extra, pero otros tipos de cadena tienen cuatro bytes adicionales. – inzKulozik

+0

Lo sé, pero las cadenas cortas se llaman cadenas pascales ;-). –

+2

Muy buena respuesta, corta y dulce, directa al grano, e incluye los ejemplos más comunes del mundo real. –

3

No siempre, depende de la codificación.

6

Depende de lo que quiere decir con "longitud". Si se refiere a "número de caracteres", entonces, no, muchos idiomas/métodos de codificación utilizan más de un byte por carácter.

22

Todo depende de la plataforma y la representación.

Por ejemplo, en .NET una cadena toma dos bytes en la memoria por punto de código UTF-16. Sin embargo, los pares suplentes requieren dos valores UTF-16 para un carácter Unicode completo en el rango de U + 100000 a U + 10FFFF. El formulario en memoria también tiene una sobrecarga para la longitud de la cadena y posiblemente algo de relleno, así como la sobrecarga de objetos normales de un puntero de tipo, etc.

Ahora, cuando escribe una cadena en el disco (o red, etc.) desde .NET, usted especifica la codificación (con la mayoría de las clases predeterminadas a UTF-8). En ese punto, el tamaño depende mucho de la codificación. ASCII siempre toma un solo byte por carácter, pero es muy limitado (sin acentos, etc.); UTF-8 proporciona el rango Unicode completo con una codificación variable (todos los caracteres ASCII se representan en un solo byte, pero otros ocupan más). UTF-32 siempre usa exactamente 4 bytes para cualquier carácter Unicode; la lista continúa.

Como puede ver, no es un tema simple. Para calcular cuánto espacio va a ocupar una cadena, deberá especificar exactamente cuál es la situación, si se trata de un objeto en la memoria en alguna plataforma (y si es así, qué plataforma), posiblemente incluso hasta la implementación y la configuración del sistema operativo), o si se trata de un formulario en bruto codificado, como un archivo de texto, y si es así, con qué codificación.

+2

¡Qué desastre tenemos! – Malfist

+1

Y, por supuesto, el tamaño en el disco cambia con/sin una lista de materiales. Solo por diversión extra ;-p –

3

No hay una sola respuesta; que depende de la lengua y aplicación (recuerde que algunos idiomas tienen múltiples implementaciones!)

cadenas de caracteres ASCII

Zero-terminados ocupan al menos uno más bytes que el "contenido" de la cadena. (Más puede asignarse, dependiendo de cómo se creó la cadena.)

cadenas terminadas en cero para no utilizar un descriptor (o estructura similar) para grabar la longitud, que tiene memoria adicional alguna parte.

Las cadenas Unicode (en varios idiomas) utilizan dos bytes por carácter.

Las cadenas en una tienda de objetos se pueden referenciar mediante identificadores, lo que agrega una capa de direccionamiento indirecto (y más datos) para simplificar la administración de la memoria.

2

Estás en la correcta. Si codifica como ASCII, hay un byte por carácter. De lo contrario, es uno o más bytes por carácter.

En particular, es importante saber cómo funciona esto en las operaciones de subcadenas. Si no tiene un byte por carácter, ¿s [n] obtiene el n-ésimo byte o el n-ésimo carácter? Obtener el enésimo carácter será ineficaz para n grande en lugar de constante, como ocurre con un byte por carácter.

Cuestiones relacionadas