¿Cuánta RAM consume cada carácter en la cadena ECMAScript / JavaScript?

La pregunta es bastante simple: ¿cuánta RAM en bytes consume cada carácter en una cadena ECMAScript / JavaScript?

Voy a adivinar dos bytes, ya que el estándar dice que se almacenan como enteros sin signo de 16 bits.

¿Significa esto que cada carácter tiene siempre dos bytes?

preguntado el 27 de agosto de 11 a las 20:08

Supongo que esto depende del contexto del juego de caracteres en el que esté trabajando. No estoy seguro de si esto es (o pertenece) al estándar del lenguaje. ¿Por qué eliminó su última pregunta (¡muy interesante!) En lugar de agregar la información en qué navegador estaba probando? -

@Pekka: Realmente no sé qué decir sobre el conjunto de caracteres. Si tengo un archivo fuente de JavaScript que ejecuto a través del motor V8, ¿en qué punto exactamente se especifica un juego de caracteres? Creo que los archivos fuente de JS se interpretan utilizando el mismo conjunto de caracteres que se utiliza para las cadenas. -

Ah. Me refiero a JS en los navegadores; de su última pregunta asumí lo mismo. -

@rFactor, en cuanto a la codificación fuente, ECMA-262 dice explícitamente (al comienzo del capítulo 6) que las implementaciones que admiten codificaciones fuente distintas de UTF-16 deben comportarse como si el código fuente se transcodificara a UTF-16 antes de ser interpretado. -

@Henning: eso tiene sentido. Gracias. -

1 Respuestas

Sí, creo que ese es el caso. Los caracteres probablemente se almacenan como cadenas anchas o cadenas UCS2. Pueden ser UTF-16, en cuyo caso ocupan dos palabras (enteros de 16 bits) por carácter para caracteres fuera del BMP (plano multilingüe básico), pero creo que estos caracteres no son totalmente compatibles. Lee esto entrada de blog sobre problemas en la implementación UTF16 de ECMA.

La mayoría de los lenguajes modernos almacenan sus cadenas con caracteres de dos bytes. De esta manera, tiene soporte completo para todos los idiomas hablados. Cuesta un poco de memoria extra, pero eso es un maní para cualquier computadora moderna con RAM multiGig. Almacenar la cadena en UTF8 más compacto hará que el procesamiento sea más complejo y más lento. Por lo tanto, UTF8 se utiliza principalmente para el transporte. ASCII solo admite el alfabeto latino sin signos diacríticos. ANSI todavía es limitado y necesita una página de códigos específica para tener sentido.

Sección 4.13.16 de ECMA-262 define explícitamente "Valor de cadena" como un "valor primitivo que es una secuencia finita ordenada de cero o más enteros sin signo de 16 bits". Eso sugiere que los programas usan estos valores de 16 bits como texto UTF-16, pero es legal simplemente usar una cadena para almacenar cualquier arreglo inmutable de cortos sin firmar.

Tenga en cuenta que el tamaño de los caracteres no es lo único que constituye el tamaño de la cadena. No sé acerca de la implementación exacta (y podría diferir), pero las cadenas tienden a tener un terminador 0x00 para que sean compatibles con PChars. Y probablemente tengan algún encabezado que contenga el tamaño de la cadena y tal vez alguna información de recuento e incluso codificación. Una cadena con un carácter puede consumir fácilmente 10 bytes o más (sí, eso es 80 bits).

respondido 07 mar '13, 03:03

"Las cadenas en ECMA siempre están en Unicode" icu-project.org/docs/papers/… Unicode aquí significa la implementación UTF16 (paralizada) que mencioné. Al colocar estas cadenas en un documento HTML, el documento HTML / XML del navegador convertirá esta cadena según sea necesario. - GolezTrol

¿Los caracteres en BMP requieren solo 1 byte en UTF-16 o UCS2? ¿Qué pasa con UTF-8? - tower

Hay una diferencia entre bytes, unidades de código y puntos de código. Unicode tiene aproximadamente 1.1 millones de puntos de código, donde ASCII tiene 128. La unidad de código de ANSI y UTF8 es 1 byte, donde es 2 bytes para UTF-16. Eso significa que cada carácter en UTF16 ocupa 2 bytes o un múltiplo de 2 bytes. Los caracteres del BMP ocupan 1 unidad de código (2 bytes) tanto en UTF-16 como en UCS2. En realidad, creo que UCS2 y UTF-16 son iguales para esos caracteres en el BMP, pero UTF-16 admite caracteres fuera del BMP, aunque estos ocupan varias unidades de código. - GolezTrol

Si alguien tiene ganas de leer un poco, lea sobre 'El mínimo absoluto que todo desarrollador debe saber sobre Unicode'. Es bastante interesante, y es más fácil aprender de esa página, que de una simple sinopsis que estoy escribiendo en los comentarios aquí: joelonsoftware.com/articles/Unicode.html - GolezTrol

@Pekka, la especificación del lenguaje dice explícitamente 16 bits por elemento en una cadena. He agregado una referencia a la respuesta. (En principio, una implementación podría optar por almacenar cadenas internamente como UTF-8, excepto que complicaría la implementación de charAt()). - hmakholm dejó a Monica

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.