Conjunto de personagens de JavaScript:
Os programas JavaScript são escritos usando conjuntos de caracteres Unicode. O Unicode é um superconjunto de ASCII e Latin-1 e suporta quase todas as línguas na Terra. O ECMAScript3 requer JavaScript para suportar o Unicode 2.1 e as versões subsequentes, enquanto o ECMAScript5 requer suporte a Unicode 3 e versões subsequentes. Então, nós escrevemos
Os programas JavaScript são todos codificados usando o Unicode.
UTF-8
UTF-8 (formato de transformação de unicode UTF8-bit) é um caractere de comprimento variável que codifica para Unicode e também é um código de prefixo.
Ele pode ser usado para representar qualquer caractere no padrão Unicode, e o primeiro byte em sua codificação ainda é compatível com o ASCII, o que possibilita o software que originalmente lida com caracteres ASCII para continuar a usar sem ou requer uma pequena quantidade de modificação. Portanto, tornou -se gradualmente a codificação preferida em e -mails, páginas da Web e outros aplicativos para armazenar ou enviar texto.
A maioria dos sites atualmente usa a codificação UTF-8.
Converter String codificada por Unicode gerada por JavaScript para UTF-8 String codificada
Conforme mencionado no título, o cenário do aplicativo é muito comum. Por exemplo, ao enviar um binário para o servidor, o servidor estipula que a codificação do conteúdo binário deve ser UTF-8. Nesse caso, devemos converter a sequência Unicode de JavaScript em uma sequência codificada UTF-8 através do programa.
Método de conversão
Antes da conversão, devemos entender que a estrutura de codificação da Unicode é fixa.
Se você não acredita, pode experimentar o método Charcodeat of String para ver quantos bytes o charcode retornado ocupa.
• O inglês ocupa 1 personagem e os caracteres chineses ocupa 2 caracteres
No entanto, o comprimento da estrutura de codificação do UTF-8 é determinado pelo tamanho de um único caractere.
Abaixo está o tamanho de um único caractere que ocupa vários bytes. O comprimento máximo após um único caractere unicode é de 6 bytes.
• 1 byte: o código Unicode é 0 - 127
• 2 bytes: o código Unicode é 128 - 2047
• 3 bytes: o código Unicode é 2048 - 0xffff
• 4 bytes: o código Unicode é 65536 - 0x1fffff
• 5 bytes: o código Unicode é 0x200000 - 0x3ffffff
• 6 bytes: o código Unicode é 0x4000000 - 0x7ffffff
Para detalhes, consulte a foto:
Como os códigos unicode de caracteres em inglês e inglês são 0 - 127, o comprimento e os bytes do inglês no Unicode e o UTF -8 são os mesmos e apenas ocupam 1 byte. É por isso que o UTF8 é um superconjunto do Unicode!
Agora, vamos discutir caracteres chineses, porque o intervalo de código Unicode de caracteres chineses é 0x2E80 - 0x9FFF, portanto, o comprimento dos caracteres chineses no UTF8 é de até 3 bytes.
Então, como os caracteres chineses se convertem de 2 bytes de Unicode para três bytes do UTF8?
Suponha que eu precise converter caráter chinês "中" em codificação UTF-8
1. Obtenha o tamanho do valor unicode dos caracteres chineses
var str = 'in'; var charcode = str.charcodeat (0); console.log (charcode); // => 20013
2. Julgando a duração do UTF8 com base no tamanho
A partir da etapa anterior, obtemos o charcode do personagem chinês "em" é 20013. Depois, descobrimos que 20013 está localizado no intervalo 2048 - 0xffff, para que o personagem chinês "em" deve ocupar 3 bytes no UTF8.
3. Complemento
Como sabemos que o personagem chinês "eu" precisa ocupar 3 bytes, como podemos obter esses 3 bytes?
Isso requer projetar o código do complemento. A lógica específica do código de complemento é a seguinte:
Ok, eu sei que você não consegue entender essa foto, então vou falar sobre isso!
O código de preenchimento específico é o seguinte, "X" indica o espaço vazio, usado para preenchimento.
• 0xxxxxxx
• 110xxxxxx 10xxxxxx
• 1110xxxx 10xxxxxx 10xxxxxx
• 11110xxx 10xxxxxx 10xxxxxx 10xxxxxxx
• 111110xx 10xxxxxx 10xxxxxx 10xxxxxxx 10xxxxxxx 10xxxxxx
• 1111110x 10xxxxxx 10xxxxxx 10xxxxxxx 10xxxxxx 10xxxxxx 10xxxxxxx
AVISO: Você encontrou isso? O primeiro byte do código de preenchimento indica quantos bytes todo o código UTF-8 ocupa! Este recurso é usado pelo UTF-8 decodificado para unicode ~
Vamos dar um exemplo simples primeiro. Converta a letra em inglês "A" para a codificação UTF8.
1. O charcode de "A" é 65
2. 65 está no intervalo entre 0-127, então "A" ocupa um byte
3. O complemento de um byte no UTF8 é 0xxxxxxx. X representa uma posição vago e é usado para complementar.
4. Converta 65 em binário para obter 1000001
5. Adicione 1000001 às vagas de 1xxxxxx em ordem de frente para trás e obtenha 01000001
6. Converta 11000001 em uma corda para obter "A"
7. Finalmente, "A" é codificado pelo UTF8.
Com este pequeno exemplo, verificamos novamente que o UTF-8 é um superconjunto do Unicode!
Ok, vamos voltar ao personagem chinês "Middle". Antes, temos o charcode de "Middle" como 20013 e o binário é 010011100 00101101. Os detalhes são os seguintes:
var code = 20013; code.ToString (2); // => 10011100101 é equivalente a 01001110 00101101
Em seguida, seguimos o método de "A" preenchendo o acima para preencher a posição.
Complemento 01001110 00101101 na ordem da frente para trás para 1110xxxxx 10xxxxxx 10xxxxxx. Get 11100100 10111000 10101101.
4. Obtenha conteúdo codificado UTF8
Através das etapas acima, obtemos três bytes UTF8 de "in", 11100100 10111000 1010110101.
Convertemos cada byte em hexadecimal e obtemos 0xe4 0xb8 0xad;
Então este 0xe4 0xb8 0xad é a codificação UTF8 que finalmente obtemos.
Usamos o buffer NodeJS para verificar se está correto.
var buffer = new buffer ('in'); console.log (buffer.length); // => 3console.log (buffer); // => <buffer e4 b8 ad> // finalmente obtém três bytes 0xe4 0xb8 0xadComo o hexadecimal é isento de casos, é exatamente o mesmo que calculamos que 0xe4 0xb8 0xad?
Escreva a lógica de codificação acima em uma função.
// formate a sequência em bytes codificados por 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 & (code >> 6))))); back.push ((128 | (63 & code)))} 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 & code)))}} para (i = 0; i <back.length; i ++) {back [i] & = 0xff; } if (isGetBytes) {return back} if (bytesize <= 0xff) {return [0, bytesize] .Concat (traseiro); } else {return [byTesize >> 8, bytesize & 0xff] .concat (traseiro); }} writeutf ('in-on'); // => [0, 3, 228, 184, 173] // Os dois primeiros dígitos representam o comprimento dos bytes UTF8 subsequentes. Como o comprimento é 3, os dois primeiros bytes são `0, 3 '// o conteúdo é` 228, 184, 173' e convertido em hexadecimal é `0xe4 0xb8 0xad` // Leia bytes codificados por UTF8 e é especialmente projetado para string unicode var 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 += string.FromCharCode (Parseint (Store, 2)); i += bytesLength - 1} else {utf += string.fromCharcode (_arr [i])}} retornar utf} readutf ([0, 3, 228, 184, 173]); => 'Em'Outro método para analisar os chineses para obter UTF8 ByteCode
Outro método relativamente simples para converter chinês em utf8 bytecode é relativamente simples. O navegador também fornece um método e todos estão usando esse método. O que é? É Encodeuri. Obviamente, o Codeuricomponent também está ok.
É isso mesmo, esse é o método. Então, como esse método converte um chinês codificado por unicode em bytecode UTF8?
var str = ''; var code = codeuri (str); console.log (código); // =>%E4%B8%AD
Você descobriu que eu recebi uma string escapada e o conteúdo nessa sequência é o mesmo que o bytecode que eu tinha acima antes.
Em seguida, convertemos%E4%B8%AD em uma matriz numérica.
var codelist = code.split ('%'); codelist = codelist.map (item => parseint (item, 16)); console.log (codelista); // => [228, 184, 173]Tão simples, existe alguma ~~~
Qual é o princípio desse método simples?
Aqui está o problema da codificação de consultas nos URIs. Porque, de acordo com os regulamentos, a consulta no URI deve ser transmitida de acordo com a codificação UTF8, e o JavaScript é Unicode, portanto o navegador nos fornece um método, ou seja, o método codeuri/codeuricomponent. Este método será explicado
Os caracteres não ingleses (isso é considerado, por que os caracteres não ingleses?) São convertidos pela primeira vez em UTF8 Bytecode e depois adicionados%na frente para conserê-los, então escapamos do personagem chinês "中" e obtivemos "%e4%b8%ad".
Bem, esses são todos os princípios, nada mais.
No entanto, esse método tem outra desvantagem, ou seja, ele apenas escapará de caracteres não ingleses; portanto, quando precisamos formatar os caracteres em inglês na codificação UTF8, esse método não pode atender às nossas necessidades e também precisamos escapar dos caracteres em inglês.
Então, o que devo fazer quando quiser analisá -lo? Basta usar decodeuri/decodeuricomponent.
var codElist = [228, 184, 173]; var code = codelist.map (item => '%'+item.toString (16)). JONE (''); decodeuri (código); // =>Ok, este artigo apresentará a codificação UTF8.
Espero que isso possa ajudá-lo a entender os princípios da codificação UTF-8.
O exposto acima são todos os métodos de implementação para a codificação do UTF-8 através do JavaScript trazido a você. Espero que todos apoiem mais wulin.com ~