/ / Java unicode byte parsing - java, string, unicode, codificação

Análise de byte unicode em Java - java, string, unicode, codificação

Estou apenas no processo de ler alguns dados de um arquivo como um fluxo de bytes, e acabei de encontrar algumas strings unicode com as quais não tenho certeza da melhor forma de lidar.

Cada caractere está usando dois bytes, com apenas o primeiro parecendo conter dados reais; portanto, por exemplo, a cadeia "trust" é armazenada no arquivo como:

0x74 0x00(t) 0x72 0x00(r) ...and so on

Normalmente, bastava usar um regex para substituir os zeros por nada e, portanto, remover o espaço em branco. No entanto, os espaços entre as palavras no arquivo são implementados usando 0x00 0x00, portanto, tentar fazer uma string simples "replaceAll" é meio que estragar um pouco.

Tentei brincar com os conjuntos de codificação String, como "ISO-8859-1" e "utf-8/16", mas sempre que acabo com espaço em branco.

Eu criei um regex simples para remover os valores hexadecimais zero duplos, que é:

new String(bytes).replaceAll("[\00]{2,},"");

Mas isso obviamente funciona apenas para o zero duplo, e eu realmente gostaria de substituir zeros únicos por nada e zeros duplos por um caractere de espaço ASCII / Unicode real.

Eu poderia jurar que uma das cadeias Javaas configurações de formato lidam com esse tipo de coisa, mas posso estar errado. Então, devo trabalhar na criação de uma regex para eliminar os zeros ou o Java realmente fornece os mecanismos para isso?

obrigado

Respostas:

6 para resposta № 1

Isso é "UTF-16LE". 0x00 0x00 realmente codifica o caractere NUL em UTF-16, para que seja isso que você obterá.

Essa codificação pode codificar cerca de um milhão de caracteres diferentes, usando 2 ou 4 bytes por caractere. Os primeiros 256 caracteres são codificados com o segundo byte 0x00 e se o texto contiver apenas aqueles, poderá ser considerado inútil, mas é necessário para o restante dos caracteres. Por exemplo, o símbolo da moeda do euro apareceria como 0xAC 0x20.


3 para resposta № 2

Estou apenas no processo de ler alguns dados de um arquivo como um fluxo de bytes, e acabei de encontrar algumas strings unicode com as quais não tenho certeza da melhor forma de lidar.

Converta-os em seqüências de caracteres usando o conjunto de caracteres apropriado, neste caso, UTF-16LE (little endian UTF-16, com o byte de baixa ordem seguido primeiro pelo byte de alta ordem)

String str = new String(bytes, "UTF-16LE");