Conjunto de personajes de JavaScript:
Los programas JavaScript se escriben utilizando conjuntos de caracteres Unicode. Unicode es un superconjunto de ASCII y Latin-1 y apoya casi todos los idiomas en la Tierra. ECMAScript3 requiere que JavaScript admita Unicode 2.1 y versiones posteriores, mientras que ECMAScript5 requiere soporte de UNICODE 3 y versiones posteriores. Entonces, lo escribimos
Los programas JavaScript están codificados utilizando Unicode.
UTF-8
UTF-8 (formato de transformación Unicode UTF8-bit) es un carácter de longitud variable que codifica unicode y también es un código de prefijo.
Se puede usar para representar cualquier carácter en el estándar Unicode, y el primer byte en su codificación aún es compatible con ASCII, lo que hace posible que el software que originalmente maneja los caracteres ASCII continúe usando sin o requiere una pequeña cantidad de modificación. Por lo tanto, se ha convertido gradualmente en la codificación preferida en correos electrónicos, páginas web y otras aplicaciones para almacenar o enviar mensajes de texto.
La mayoría de los sitios web utilizan actualmente la codificación UTF-8.
Convertir una cadena codificada de unicode generada por JavaScript en cadena codificada UTF-8
Como se menciona en el título, el escenario de la aplicación es muy común. Por ejemplo, al enviar un binario al servidor, el servidor estipula que la codificación del contenido binario debe ser UTF-8. En este caso, debemos convertir la cadena Unicode de JavaScript en una cadena codificada UTF-8 a través del programa.
Método de conversión
Antes de la conversión, debemos entender que la estructura de codificación de Unicode es fija.
Si no lo cree, puede probar el método de cadena de charcodios para ver cuántos bytes se lleva el Charcode devuelto.
• El inglés ocupa 1 caracteres y caracteres chinos ocupa 2 caracteres
Sin embargo, la longitud de la estructura de codificación de UTF-8 está determinada por el tamaño de un solo carácter.
A continuación se muestra el tamaño de un solo personaje que ocupa varios bytes. La longitud máxima después de un solo carácter unicode es de 6 bytes.
• 1 byte: el código unicode es 0 - 127
• 2 bytes: el código Unicode es 128 - 2047
• 3 bytes: el código Unicode es 2048 - 0xffff
• 4 bytes: el código unicode es 65536 - 0x1fffff
• 5 bytes: el código Unicode es 0x200000 - 0x3ffffff
• 6 bytes: el código Unicode es 0x4000000 - 0x7ffffff
Para más detalles, consulte la imagen:
Debido a que los códigos Unicode de los caracteres ingleses e ingleses son 0 - 127, la longitud y los bytes del inglés en Unicode y UTF -8 son los mismos, y solo ocupan 1 byte. ¡Es por eso que UTF8 es un superconjunto de Unicode!
Ahora discutamos los caracteres chinos, porque el intervalo de código Unicode de los caracteres chinos es 0x2e80 - 0x9fff, por lo que la longitud de los caracteres chinos en UTF8 es de hasta 3 bytes.
Entonces, ¿cómo se convierten los caracteres chinos de 2 bytes de Unicode a tres bytes de UTF8?
Supongamos que necesito convertir el carácter chino "中" en la codificación UTF-8
1. Obtenga el tamaño de valor unicode de los caracteres chinos
var str = 'in'; var charcode = str.charcodeat (0); console.log (charcode); // => 20013
2. Juzgando la longitud de UTF8 en función del tamaño
Desde el paso anterior obtenemos el carbón del personaje chino "en" IS 20013. Luego encontramos que 20013 se encuentra en el intervalo 2048 - 0xffff, por lo que el carácter chino "en" debería ocupar 3 bytes en UTF8.
3. Complemento
Dado que sabemos que el personaje chino "yo" necesita ocupar 3 bytes, ¿cómo podemos obtener estos 3 bytes?
Esto requiere diseñar el código del complemento. La lógica específica del código del complemento es la siguiente:
Ok, sé que no puedes entender esta imagen, ¡así que hablaré de eso!
El código de relleno específico es el siguiente, "X" indica el espacio vacío, utilizado para el relleno.
• 0xxxxxxx
• 110xxxxx 10xxxxxx
• 1110XXXX 10XXXXXX 10XXXXXX
• 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
• 111110XX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX
• 1111110x 10XXXXXX 10XXXXX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX
ADVERTENCIA: ¿Lo has encontrado? ¡El primer byte del código de relleno indica cuántos bytes ocupa todo el código UTF-8! Esta característica es utilizada por UTF-8 decodificada a Unicode ~
Primero damos un ejemplo simple. Convierta la letra inglesa "A" a la codificación UTF8.
1. El carbón de "A" es 65
2. 65 está en el intervalo entre 0-127, por lo que "A" ocupa un byte
3. El complemento de un byte en UTF8 es 0xxxxxxx. X representa una posición vacante y se usa para el complemento.
4. Convierta 65 a binario para obtener 1000001
5. Agregue 1000001 a las vacantes de 1xxxxxx en orden de adelante hacia atrás, y obtenga 01000001
6. Convierta 11000001 en una cadena para obtener "A"
7. Finalmente, "A" está codificado por UTF8.
Con este pequeño ejemplo, ¿verificamos nuevamente que UTF-8 es un superconjunto de Unicode!
Bien, volvamos al personaje chino "Medio". Antes, tenemos el carbón de "Middle" como 20013 y el binario es 010011100 00101101. Los detalles son los siguientes:
Código var = 20013; Code.ToString (2); // => 10011100101 es equivalente a 01001110 00101101
Luego, seguimos el método de "un" relleno de lo anterior para completar el puesto.
Complemento 01001110 00101101 en el orden de adelante hacia atrás a 1110xxxxx 10xxxxxx 10xxxxxxx. Obtenga 11100100 10111000 10101101.
4. Obtenga contenido codificado UTF8
A través de los pasos anteriores obtenemos tres bytes UTF8 de "In", 11100100 10111000 1010110101.
Convertimos cada byte a hexadecimal y obtenemos 0xe4 0xb8 0xad;
Entonces este 0xe4 0xb8 0xad es la codificación UTF8 que finalmente obtuvimos.
Usamos NodeJS Buffer para verificar si es correcto.
var buffer = new Buffer ('in'); console.log (buffer.length); // => 3console.log (buffer); // => <buffer e4 b8 ad> // finalmente obtenga tres bytes 0xe4 0xb8 0xadDebido a que hexadecimal está libre de casos, ¿es exactamente lo mismo que calculamos que 0xe4 0xb8 0xad?
Escriba la lógica de codificación anterior en una función.
// formatear la cadena en bytes codificados con utf8 var writeutf = function (str, isgetBytes) {var back = []; var bytesize = 0; for (var i = 0; i <str.length; i ++) {var code = str.charcodeat (i); if (0x00 <= code && code <= 0x7f) {bytesize += 1; back.push (código); } else if (0x80 <= code && code <= 0x7ff) {bytesize += 2; back.push ((192 | (31 & (código >> 6))))); back.push ((128 | (63 y código)))} else if ((0x800 <= code && code <= 0xd7ff) || (0xe000 <= code && code <= 0xffff)) {bytesize += 3; back.push ((224 | (15 & (código >> 12)))); back.push ((128 | (63 & (código >> 6)))); back.push ((128 | (63 y código)))}} para (i = 0; i <back.length; i ++) {back [i] & = 0xff; } if (isgetBytes) {return back} if (bytesize <= 0xff) {return [0, bytesize] .concat (back); } else {return [bytesize >> 8, bytesize & 0xff] .concat (back); }} writeutf ('in-on'); // => [0, 3, 228, 184, 173] // Los dos primeros dígitos representan la longitud de los bytes UTF8 posteriores. Debido a que la longitud es 3, los dos primeros bytes son `0, 3` // El contenido es` 228, 184, 173` y convertido a hexadecimal es `0xe4 0xb8 0xad` // Leer bytes codificados UTF8 y está especialmente diseñado para la cadena var de Unicode readutf = function (arr) {if (typeof arr === 'string') {return arr; } var utf = '', _arr = this.init (arr); for (var i = 0; i <_arr.length; i ++) {var one = _arr [i] .ToString (2), v = one.match (/^1+? (? = 0)/); if (v && one.length == 8) {var byteslength = v [0] .length; Var store = _arr [i] .ToString (2) .slice (7 - byteslength); for (var st = 1; st <byteslength; st ++) {store += _arr [st +i] .ToString (2) .slice (2)} utf += stromCharCode (parseInt (store, 2)); i += byteslength - 1} else {utf += string.FromCharCode (_arr [i])}} return Utf} Readutf ([0, 3, 228, 184, 173]); => 'En'Otro método para analizar el chino para obtener UTF8 Bytecode
Otro método relativamente simple para convertir chino a UTF8 bytecode es relativamente simple. El navegador también proporciona un método, y todos han estado utilizando este método. ¿Qué es? Es encodeuri. Por supuesto, Codeuricomponent también está bien.
Así es, ese es el método. Entonces, ¿cómo se convierte este método en un chino codificado unicode en UTF8 bytecode?
var str = ''; var code = encodeuri (str); console.log (código); // =>%E4%B8%AD
¿Has descubierto que obtuve una cadena escapada, y el contenido en esta cadena es el mismo que el bytecode que obtuve antes?
A continuación, convertimos%E4%B8%AD en una matriz de números.
var codeList = code.split ('%'); codeList = codeList.map (item => parseInt (item, 16)); console.log (codeList); // => [228, 184, 173]Tan simple, ¿hay alguna ~~~?
¿Cuál es el principio de este método simple?
Aquí está el problema de la codificación de consulta en URI. Porque según las regulaciones, la consulta en URI debe transmitirse de acuerdo con la codificación de UTF8, y JavaScript es unicode, por lo que el navegador nos proporciona un método, es decir, el método Codeuri/CodeRiCoponent. Este método se explicará
Los caracteres no ingleses (esto se considera, ¿por qué los caracteres no ingleses?) Primero se convierten en Bytecode UTF8, y luego se agregan%al frente para empalmarlos, por lo que escapamos del personaje chino "中" y obtuvimos "%E4%B8%AD".
Bueno, esos son todos los principios, nada más.
Sin embargo, este método tiene otra desventaja, es decir, solo escapará de los caracteres no ingleses, por lo que cuando necesitamos formatear los caracteres ingleses en la codificación UTF8, este método no puede satisfacer nuestras necesidades, y también necesitamos escapar de los caracteres ingleses.
Entonces, ¿qué debo hacer cuando quiero analizarlo? Simplemente use Decodeuri/Decodeuricomponent.
var codeList = [228, 184, 173]; var code = codeList.map (item => '%'+item.ToString (16)). Join (''); decodeuri (código); // =>De acuerdo, este artículo presentará la codificación UTF8.
Espero que pueda ayudarlo a comprender los principios de la codificación UTF-8.
Lo anterior son todos los métodos de implementación para la codificación UTF-8 a través de JavaScript que se le traen. Espero que todos apoyen a Wulin.com más ~