UTF-8: Unicode TransformationFormat-8bit, BOM é permitido, mas BOM geralmente não é incluído. É uma codificação multibyte usada para resolver caracteres internacionais. Ela usa 8 bits (ou seja, um byte) para inglês e 24 bits (três bytes) para chinês. UTF-8 contém caracteres que são usados por todos os países do mundo. É uma codificação internacional e tem grande versatilidade. O texto codificado em UTF-8 pode ser exibido em navegadores de vários países que suportam o conjunto de caracteres UTF8. Por exemplo, se for codificação UTF8, o chinês também pode ser exibido no IE inglês de estrangeiros, e eles não precisam baixar o pacote de suporte ao idioma chinês do IE.
GBK é um padrão baseado no padrão nacional GB2312 e expandido para ser compatível com GB2312. A codificação de texto do GBK é representada por bytes duplos, ou seja, os caracteres chineses e ingleses são representados por bytes duplos. Para distinguir os caracteres chineses, os bits mais altos são definidos como 1. GBK contém todos os caracteres chineses e é uma codificação nacional. É menos versátil que UTF8, mas UTF8 ocupa um banco de dados maior que GBD.
GBK, GB2312, etc. devem ser convertidos para UTF8 através da codificação Unicode:
GBK, GB2312--Unicode--UTF8
UTF8 - Unicode - GBK, GB2312
Para um site ou fórum, se houver muitos caracteres em inglês, é recomendado usar UTF-8 para economizar espaço. No entanto, muitos plug-ins de fórum agora geralmente suportam apenas GBK.
Explicação detalhada da diferença entre codificações. Simplificando, unicode, gbk e cinco grandes códigos são os valores codificados, e utf-8, uft-16 e similares são as expressões desse valor. Os três códigos anteriores são compatíveis. Para o mesmo caractere chinês, os três valores de código são completamente diferentes. Por exemplo, o valor uncode de "Han" é diferente de gbk. Suponha que o uncode seja a040 e gbk seja b030, e o código uft-8 seja a forma na qual esse valor é expresso. O código utf-8 é completamente organizado apenas para descodificar. Se o GBK quiser ser convertido para UTF-8, ele deve ser convertido primeiro para descodificar e depois convertido para utf-8 e está tudo bem.
Para obter detalhes, consulte o artigo reimpresso abaixo.
Vamos falar sobre codificação Unicode e explicar brevemente termos como UCS, UTF, BMP e BOM. Esta é uma leitura interessante escrita por programadores para programadores. A chamada diversão significa que você pode entender facilmente alguns conceitos antes pouco claros e melhorar seu conhecimento, o que é semelhante ao upgrade em um jogo de RPG. A motivação para organizar este artigo são duas questões:
Pergunta um:
Usando "Salvar como" no Bloco de Notas do Windows, você pode converter entre os métodos de codificação GBK, Unicode, Unicode big endian e UTF-8. Ou você pode ir diretamente para http://www.knowsky.com/tools/utf8.asp para conversão online.
Também é um arquivo txt. Como o Windows identifica o método de codificação?
Descobri há muito tempo que arquivos Unicode, Unicode bigendian e arquivos txt codificados em UTF-8 terão mais alguns bytes no início, que são FF, FE (Unicode), FE, FF (Unicode bigendian), EF, BB, BF (UTF-8). Mas em que critérios se baseiam esses marcadores?
Pergunta dois:
Recentemente vi o ConvertUTF.c na Internet, que realiza a conversão mútua de UTF-32, UTF-16 e UTF-8. Já conheço métodos de codificação como Unicode (UCS2), GBK e UTF-8. Mas este programa me deixa um pouco confuso e não consigo lembrar qual é a relação entre UTF-16 e UCS2.
Depois de verificar as informações relevantes, finalmente esclareci essas questões e também aprendi alguns detalhes sobre Unicode. Escreva um artigo e envie-o para amigos que tenham dúvidas semelhantes. Este artigo foi escrito da forma mais fácil de entender possível, mas os leitores devem saber o que são bytes e o que é hexadecimal.
0. big endian e little endian
big endian e little endian são maneiras diferentes pelas quais a CPU lida com números multibyte. Por exemplo, a codificação Unicode do caractere "汉" é 6C49. Então, ao gravar em um arquivo, 6C deve ser escrito na frente ou 49 na frente? Se 6C estiver escrito na frente, é big endian. Se 49 estiver escrito na frente, é little endian.
A palavra "endian" vem de "As Viagens de Gulliver". A guerra civil em Lilliput foi causada pela quebra dos ovos do Big-Endian ou do Little-Endian. Como resultado, houve seis rebeliões.
Geralmente traduzimos endian como "ordem de bytes", e big endian e little endian são chamados de "big end" e "little end".
1. Codificação de caracteres e código interno A propósito, os caracteres de codificação de caracteres chineses devem ser codificados antes de serem processados pelo computador. O método de codificação padrão usado pelo computador é o código interno do computador. Os primeiros computadores usavam codificação ASCII de 7 bits para processar caracteres chineses, os programadores projetaram o GB2312 para chinês simplificado e big5 para chinês tradicional.
As RFC2781 e RFC3629 da IETF descrevem os métodos de codificação de UTF-16 e UTF-8 de forma clara, nítida e rigorosa no estilo consistente da RFC. Sempre esqueço que IETF é a abreviatura de Internet Engineering Task Force. Contudo, a RFC mantida pela IETF é a base para todas as especificações na Internet.
2.1. Código interno e página de código.
Atualmente, o kernel do Windows já suporta o conjunto de caracteres Unicode, para que o kernel possa suportar todos os idiomas do mundo. No entanto, uma vez que um grande número de programas e documentos existentes utilizam uma determinada codificação de linguagem, como GBK, é impossível para o Windows não suportar a codificação existente e todos utilizam Unicode.
O Windows usa páginas de código para se adaptar a vários países e regiões. A página de código pode ser entendida como o código interno mencionado anteriormente. A página de código correspondente ao GBK é CP936.
A Microsoft também define uma página de código para GB18030: CP54936. No entanto, como GB18030 possui algumas codificações de 4 bytes e a página de código do Windows suporta apenas codificações de byte único e byte duplo, esta página de código não pode realmente ser usada.
3. UCS-2, UCS-4, BMP
O UCS vem em dois formatos: UCS-2 e UCS-4. Como o nome sugere, o UCS-2 é codificado com dois bytes e o UCS-4 é codificado com 4 bytes (na verdade, apenas 31 bits são usados, o bit mais alto deve ser 0). Vamos fazer alguns jogos matemáticos simples:
UCS-2 tem 2^16=65536 pontos de código e UCS-4 tem 2^31=2147483648 pontos de código.
UCS-4 é dividido em 2 ^ 7 = 128 grupos de acordo com o byte mais alto, sendo o bit mais alto 0. Cada grupo é dividido em 256 planos com base no próximo byte mais alto. Cada plano é dividido em 256 linhas de acordo com o terceiro byte, e cada linha contém 256 células. Obviamente, as células na mesma linha diferem apenas no último byte e o restante é igual.
O plano 0 do grupo 0 é denominado Plano Multilíngue Básico, ou BMP. Ou no UCS-4, os bits de código com os dois bytes superiores sendo 0 são chamados de BMP.
O UCS-2 é obtido removendo os dois primeiros bytes zero do BMP do UCS-4. Adicione dois bytes zero na frente dos dois bytes do UCS-2 para obter o BMP do UCS-4. Não há caracteres alocados fora do BMP na especificação UCS-4 atual.
4. Codificação UTF
UTF-8 codifica UCS em unidades de 8 bits. A codificação de UCS-2 para UTF-8 é a seguinte:
Codificação UCS-2 (hexadecimal) Fluxo de bytes UTF-8 (binário)
0000-007F 0xxxxxxx
0080-07FF 110xxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
Por exemplo, a codificação Unicode de "chinês" é 6C49 e está entre 0800-FFFF, portanto, você deve usar um modelo de 3 bytes: 1110xxxx 10xxxxxx10xxxxxx. Escrever 6C49 em binário é: 0110 110001 001001. Usando esse fluxo de bits para substituir x no modelo, obtemos: 1110011010110001 10001001, que é E6 B1 89.
Os leitores podem usar o Bloco de Notas para testar se nossa codificação está correta. Deve-se observar que o UltraEdit será convertido automaticamente para UTF-16 ao abrir um arquivo de texto codificado em UTF-8, o que pode causar confusão. Você pode desativar esta opção nas configurações. Uma ferramenta melhor é o Hex Workshop.
UTF-16 codifica UCS em unidades de 16 bits. Para códigos UCS menores que 0x10000, a codificação UTF-16 é igual ao número inteiro não assinado de 16 bits correspondente ao código UCS. Para códigos UCS não inferiores a 0x10000, um algoritmo é definido. Porém, como o BMP do UCS2 ou UCS4 realmente utilizado deve ser menor que 0x10000, por enquanto, pode-se considerar que UTF-16 e UCS-2 são basicamente iguais. No entanto, UCS-2 é apenas um esquema de codificação e UTF-16 é usado para transmissão real, portanto a questão da ordem dos bytes deve ser considerada.
5. Ordem de bytes UTF e BOM
UTF-8 usa bytes como unidade de codificação e não apresenta problemas de endianness. UTF-16 usa dois bytes como unidade de codificação Antes de interpretar um texto UTF-16, você deve primeiro entender a ordem dos bytes de cada unidade de codificação. Por exemplo, a codificação Unicode de "Kui" é 594E e a codificação Unicode de "B" é 4E59. Se recebermos o fluxo de bytes UTF-16 "594E", será "Ku" ou "B"?
O método recomendado para marcar a ordem dos bytes na especificação Unicode é o BOM. BOM não é a lista BOM de "lista de materiais", mas sim a marca de ordem de bytes. BOM é uma ideia um pouco inteligente:
Existe um caractere chamado "ZERO WIDTH NO-BREAKSPACE" na codificação UCS e sua codificação é FEFF. FFFE é um personagem que não existe no UCS, portanto não deve aparecer na transmissão real. A especificação UCS recomenda que transmitamos os caracteres "ZERO WIDTH NO-BREAK SPACE" antes de transmitir o fluxo de bytes.
Desta forma, se o receptor receber FEFF, indica que o fluxo de bytes é Big-Endian; se receber FFFE, indica que o fluxo de bytes é Little-Endian; Portanto o caractere “ZERO WIDTH NO-BREAK SPACE” também é chamado de BOM.
UTF-8 não requer uma BOM para indicar a ordem dos bytes, mas pode usar a BOM para indicar o método de codificação. A codificação UTF-8 do caractere "ZERO WIDTH NO-BREAKSPACE" é EF BB BF (os leitores podem verificá-la usando o método de codificação que apresentamos anteriormente). Portanto, se o receptor receber um fluxo de bytes começando com EF BBBF, ele saberá que está codificado em UTF-8.
O Windows usa BOM para marcar a codificação de arquivos de texto.
6. Outros materiais de referência O principal material de referência para este artigo é "Breve visão geral da ISO-IEC 10646 e Unicode" ( http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html ).
Também encontrei duas informações que pareciam boas, mas como já tinha as respostas às minhas perguntas iniciais, não as li:
"Compreendendo o Unicode Uma introdução geral ao padrão Unicode" ( http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a )
"Noções básicas de codificação de conjunto de caracteres Noções básicas sobre codificações de conjunto de caracteres e codificações legadas" ( http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03 )
Escrevi pacotes de software para converter UTF-8, UCS-2 e GBK entre si, incluindo versões que usam a API do Windows e versões que não usam a API do Windows. Se eu tiver tempo no futuro, irei resolver isso e colocá-lo em minha página pessoal ( http://fmddlmyy.home4u.china.com ).
Comecei a escrever este artigo depois de pensar em todas as questões e pensei que poderia terminá-lo em pouco tempo. Inesperadamente, demorou muito para considerar o texto e verificar os detalhes, e escrevi das 13h30 às 21h00. Espero que alguns leitores possam se beneficiar com isso.
Apêndice 1 Vamos falar sobre o código de localização, GB2312, código interno e página de código Alguns amigos ainda têm dúvidas sobre esta frase do artigo:
“O texto original de GB2312 ainda é o código de área. Do código de área ao código interno, você precisa adicionar A0 ao byte alto e ao byte baixo, respectivamente.
Deixe-me explicar em detalhes:
"O texto original do GB2312" refere-se a um padrão nacional de 1980, "Conjunto básico de conjuntos de caracteres codificados chineses para troca de informações padrão nacional da República Popular da China GB2312-80". Este padrão usa dois números para codificar caracteres chineses e símbolos chineses. O primeiro número é chamado de “área” e o segundo número é chamado de “bit”. Portanto, também é chamado de código de localização. As áreas 1 a 9 são símbolos chineses, as áreas 16 a 55 são caracteres chineses de primeiro nível e as áreas 56 a 87 são caracteres chineses de segundo nível. Agora o Windows também possui um método de entrada de localização, por exemplo, insira 1601 para obter “ah”. (Este método de entrada de localização pode reconhecer automaticamente os códigos hexadecimais GB2312 e decimais de localização, o que significa que inserir B0A1 também receberá "ah".)
O código interno refere-se à codificação de caracteres no sistema operacional. O código interno dos primeiros sistemas operacionais dependia do idioma. O Windows de hoje oferece suporte a Unicode no sistema e, em seguida, usa páginas de código para se adaptar a vários idiomas. O conceito de “código interno” é relativamente vago. A Microsoft geralmente se refere à codificação especificada pela página de código padrão como código interno.
Não existe uma definição oficial do termo código interno e página de código é apenas o nome da empresa Microsoft. Como programadores, desde que saibamos o que são, não há necessidade de examinar muito estes termos.
A chamada página de código (página de código) é a codificação de caracteres de um idioma. Por exemplo, a página de código do GBK é CP936, a página de código do BIG5 é CP950 e a página de código do GB2312 é CP20936.
O Windows possui o conceito de página de código padrão, ou seja, qual codificação é usada por padrão para interpretar caracteres. Por exemplo, o Bloco de Notas do Windows abre um arquivo de texto e o conteúdo interno é um fluxo de bytes: BA, BA, D7, D6. Como o Windows deve interpretá-lo?
Deve ser interpretado de acordo com a codificação Unicode, GBK, BIG5 ou ISO8859-1? Se você interpretar de acordo com GBK, obterá a palavra “caracteres chineses”. De acordo com outras interpretações de codificação, o caractere correspondente pode não ser encontrado ou o caracter errado pode ser encontrado. O chamado "erro" significa que é inconsistente com a intenção original do autor do texto e são produzidos caracteres distorcidos.
A resposta é que o Windows interpreta o fluxo de bytes no arquivo de texto de acordo com a página de código padrão atual. A página de código padrão pode ser definida através das Opções Regionais no Painel de Controle. Há um item ANSI em Salvar como do Bloco de Notas, que na verdade salva de acordo com o método de codificação da página de código padrão.
O código interno do Windows é Unicode, que pode suportar tecnicamente várias páginas de código ao mesmo tempo. Contanto que o arquivo possa explicar qual codificação ele usa e o usuário tenha instalado a página de código correspondente, o Windows poderá exibi-la corretamente. Por exemplo, o conjunto de caracteres pode ser especificado em um arquivo HTML.
Alguns autores de arquivos HTML, especialmente autores ingleses, acreditam que todas as pessoas no mundo usam inglês e não especificam charset no arquivo. Se ele usar caracteres entre 0x80-0xff e o Windows chinês os interpretar de acordo com o GBK padrão, caracteres ilegíveis aparecerão. Neste momento, basta adicionar a instrução especificando charset ao arquivo html, por exemplo:
<meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1">
Se a página de código usada pelo autor original for compatível com ISO8859-1, não haverá caracteres ilegíveis.
Vamos falar sobre o código de localização. O código de localização de Ah é 1601, que é 0x10, 0x01 em hexadecimal. Isto entra em conflito com a codificação ASCII amplamente utilizada pelos computadores. Para ser compatível com a codificação ASCII de 00-7f, adicionamos A0 aos bytes alto e baixo do código de área, respectivamente. Desta forma, o código para “ah” passa a ser B0A1. Também chamamos a codificação com dois A0s adicionados de codificação GB2312, embora o texto original do GB2312 não mencione isso.