Pergunta

Eu estou tentando obter algum código legado para exibir caracteres chineses corretamente. Uma codificação de caracteres que eu estou tentando trabalhar com começa com um 0x7F e é de 4 bytes de comprimento (incluindo o byte 0x7F). Alguém sabe que tipo de codificação este é e onde posso encontrar informações sobre isso? Thanks ..

UPDATE: Eu também tinha que trabalhar com alguns codificação japonês que começa cada personagem com um 0xE3 e é três bytes de comprimento. Ele exibe no meu computador corretamente se eu escolher o idioma japonês no Windows, no entanto, não exibir corretamente em nossa aplicação. No entanto, se qualquer outro que não seja japonês locale é selecionado, não consigo nem ver os nomes de arquivo corretamente. Então, eu estou supondo que esta codificação não é Unicode. Alguém sabe o que é? É ANSI? É Shift JIS?

Para o chinês, eu testei com Unicode e UTF-8 caracteres e que estou recebendo o mesmo padrão; 0x7F seguido de três bytes. São Unicode e UTF-8 do mesmo?

Foi útil?

Solução

Uma codificação de caracteres que eu estou tentando trabalhar com começa com um 0x7F e 4 bytes

Quais são os outros bytes? Você tem qualquer texto Latina neste codificação?

Se é “0x7f 0x ... 0x00 0x00” você está olhando para UTF-32LE. Também poderia ser dois UTF-16 (quer LE ou BE) caracteres.

codificações maioria da Ásia Oriental de usar 0x80-0xff como bytes de chumbo para caracteres não-ASCII; não há ninguém que eu conheço que usaria um 0x7F líder como algo além de um ASCII excluir.

ETA:

Existem suposto ser Byte Order Marks?

Há não precisa ser um BOM se existe uma maneira out-of-band de sinalizar que a codificação é ‘UTF-32LE’ (possivelmente uma que está perdida antes que ele chegue a você).

Eu também tive que trabalhar com alguns codificação japonês que começa cada personagem com um 0xE3 e é três bytes de comprimento.

Isso é certamente UTF-8. Sequence 0xE3 0x ... 0x ... resultaria em um personagem entre U + 3000 e U + 4000, que é onde o hiragana / katakana viver.

Ele exibe no meu computador corretamente, se eu escolher o idioma japonês no Windows, no entanto, não exibir corretamente em nossa aplicação.

Em seguida, as chances são de sua aplicação é é um dos horda lamentável de aplicativos não-Unicode-compatíveis, ainda usando ‘A’ (*) versões das interfaces Win32 dentro dos queridos W'-sufixo. Se você pode ler na string de acordo com a sua codificação real é discutível:. Um aplicativo não-Unicode-compliant nunca será capaz de exibir um ideograma do Leste Asiático em um local Ocidental

(*:.. Chamado de “ANSI”, que é um termo enganoso do Windows para “qualquer que seja a página de código sistema está configurado para no momento” é por isso mudando sua localidade afetada lo)

ETA (2):

OK, rachou. Não é qualquer padronizado codificação que eu conheci antes, mas é relativamente fácil de decifrar se você assumir a premissa de que os pontos de código Unicode estão sendo codificado.

0x00-0x7E: plain ASCII
0x7F A B C: Unicode character

O carácter codificado em uma fuga Unicode pode ser calculado com base no índice de uma cadeia de chave A, B e C e adicionando juntos:

A*0x1000 + B*0x40 + C

Ou seja, é um conjunto de caracteres base-64, mas não é o padrão Base64 habitual. Um pouco de experimentação dá uma seqüência de chave de:

.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz

A ‘’ e ‘_’ personagens são suposições, já que nenhum dos personagens que você postou usos eles. Nós precisamos de mais dados para descobrir exatamente a string.

Assim, por exemplo:

0x7F 3 u g
A=4 B=58 C=44
4*0x1000 + 58*0x40 + 44 = 0x4EAC
U+4EAC = 京

ETA (3):

Sim, ele deve ser fácil para criar uma seqüência de caracteres Unicode nativo sugando cada ponto de código manualmente e juntando-se como um personagem. Não tem a certeza que está disponível em qualquer plataforma que você está usando, mas qualquer plataforma Unicode-capable deve ser capaz de fazer uma seqüência de codepoints simplesmente (e esperemos que sem ter que manualmente re-codificar para UTF-16LE bytes).

I figurado ele deve ser codepoints Unicode por perceber que os três exemplos de personagens tinham primeira fuga-personagens na mesma gama geral, e na mesma ordem numérica como os seus codepoints Unicode. Os outros dois personagens parecia mudar de forma aleatória, por isso era muito provável uma codificação big-endian do ponto de código, e, provavelmente, uma base-64 codificação como 6 é quantos bits que você pode sair de ASCII legível.

Padrão Base64 em si começa com as letras, o que colocaria algo de partida com um número demasiado longe para ser no Plano Multilingual Básico. Então eu comecei a adivinhar com ‘0123456789ABCDEFG ...’, que seria a outra opção óbvia de corda chave. Que ficou resultando números que estavam perto dos pontos de código para caracteres dados, mas um pouco demasiado baixa. Inserindo um caractere extra no início da seqüência de chave (não tão dígito ‘0’ não mapear para o número 0) tem um dos personagens certas e os outros dois muito próximos; o que foi direito tinha letras não minúsculas, de modo a alterar apenasas letras minúsculas I inserido outro personagem entre as letras maiúsculas e minúsculas. Este veio com os números certos.

Não é garantido que este é realmente certo, mas (para além da escolha arbitrária de caracteres inseridos) que é muito provável que seja ele.

Outras dicas

Você pode querer olhar em caráter chinês codificação página na Wikipedia. O único que codifica para lá que pode ver que é sempre 4 bytes é UTF-32 .

GB 18030 é o atual conjunto de caracteres padrão chinês, mas pode ser de 1 a 4 bytes de comprimento.

Tente chardet . Ele faz um bom trabalho de adivinhar a codificação de caracteres de uma seqüência de bytes.

são Unicode e UTF-8 do mesmo?

No. UTF-8 é simplesmente uma forma de representar caracteres Unicode como uma sequência de bytes. Unicode é o padrão completo, atribuir identificadores numéricos e legíveis para cada personagem, bem como lotes de metadados sobre os personagens.

pode ser uma codificação válida Unicode, tal como um par utf-8 ou substituto UTF16.

Sim, o chinês é UTF-8, uma implementação (codificação) de Unicode. O UTF-8 é 1 byte para caracteres ASCII e até 4 bytes para os outros.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top