texto grande escape convertir completo codigo caracteres acentos acento javascript unicode astral-plane

grande - escape acentos javascript



Caracteres Unicode del código de caracteres en JavaScript para los códigos de caracteres> 0xFFFF (3)

String.fromCharCode solo puede manejar puntos de código en el BMP (es decir, hasta U + FFFF). Para manejar puntos de código más altos, esta función de Mozilla Developer Network se puede usar para devolver la representación del par suplente:

function fixedFromCharCode (codePt) { if (codePt > 0xFFFF) { codePt -= 0x10000; return String.fromCharCode(0xD800 + (codePt >> 10), 0xDC00 + (codePt & 0x3FF)); } else { return String.fromCharCode(codePt); } }

Necesito obtener un string / char de un charcode unicode y finalmente ponerlo en un DOM TextNode para agregarlo a una página HTML usando JavaScript del lado del cliente.

Actualmente, estoy haciendo:

String.fromCharCode(parseInt(charcode, 16));

donde el charcode es una cadena hexadecimal que contiene el código de caracteres, por ejemplo, "1D400" . El carácter Unicode que se debe devolver es 𝐀 , pero se devuelve ! Los caracteres en el rango de 16 bits ( 0000 ... FFFF ) se devuelven como se esperaba.

¿Alguna explicación y / o propuesta de corrección?

¡Gracias por adelantado!


La sección 8.4 de la especificación del lenguaje EcmaScript dice

Cuando una Cadena contiene datos textuales reales, se considera que cada elemento es una sola unidad de código UTF-16. Independientemente de que este sea el formato de almacenamiento real de una Cadena, los caracteres dentro de una Cadena se numeran por su posición inicial del elemento de la unidad de código como si estuvieran representados mediante UTF-16. Todas las operaciones en Strings (excepto que se indique lo contrario) las tratan como secuencias de enteros sin signo de 16 bits indiferenciados; no garantizan que la cadena resultante esté en forma normalizada, ni garantizan resultados sensibles al lenguaje.

Por lo tanto, debe codificar puntos de código suplementarios como pares de unidades de código UTF-16.

El artículo "Caracteres suplementarios en la plataforma Java" ofrece una buena descripción de cómo hacer esto.

UTF-16 utiliza secuencias de una o dos unidades de código de 16 bits sin signo para codificar puntos de código Unicode. Los valores U + 0000 a U + FFFF están codificados en una unidad de 16 bits con el mismo valor. Los caracteres suplementarios están codificados en dos unidades de código, la primera del rango de sustitutos altos (U + D800 a U + DBFF), la segunda del rango de sustitutos bajos (U + DC00 a U + DFFF). Esto puede parecer similar en concepto a las codificaciones multibyte, pero hay una diferencia importante: los valores U + D800 a U + DFFF están reservados para su uso en UTF-16; no se les asignan caracteres como puntos de código. Esto significa que el software puede determinar para cada unidad de código individual en una cadena si representa un carácter de una unidad o si es la primera o la segunda unidad de un carácter de dos unidades. Esta es una mejora significativa con respecto a algunas codificaciones de caracteres multibyte tradicionales, donde el valor de byte 0x41 podría significar la letra "A" o ser el segundo byte de un carácter de dos bytes.

La siguiente tabla muestra las diferentes representaciones de algunos personajes en comparación:

puntos de código / unidades de código UTF-16

U + 0041/0041

U + 00DF / 00DF

U + 6771/6771

U + 10400 / D801 DC00

Una vez que conozca las unidades de código UTF-16, puede crear una cadena usando la función javascript String.fromCharCode :

String.fromCharCode(0xd801, 0xdc00) === ''𐐀''


El problema es que los caracteres en JavaScript están (principalmente) codificados en UCS-2 pero pueden representar un carácter fuera del plano multilingüe básico en JavaScript como un par suplente UTF-16.

La siguiente función se adapta desde la conversión de punycode con el carácter del tablero a Unicode :

function utf16Encode(input) { var output = [], i = 0, len = input.length, value; while (i < len) { value = input[i++]; if ( (value & 0xF800) === 0xD800 ) { throw new RangeError("UTF-16(encode): Illegal UTF-16 value"); } if (value > 0xFFFF) { value -= 0x10000; output.push(String.fromCharCode(((value >>>10) & 0x3FF) | 0xD800)); value = 0xDC00 | (value & 0x3FF); } output.push(String.fromCharCode(value)); } return output.join(""); } alert( utf16Encode([0x1D400]) );