Que codifica para a conversão em java
-
04-07-2019 - |
Pergunta
Existe alguma biblioteca Java livre que eu posso usar para string convertido em uma codificação para outra codificação, algo como iconv
? Eu estou usando Java versão 1.3.
Solução
Você não precisa de uma biblioteca para além da única norma - basta usar Charset . (Você pode apenas usar os construtores de corda e métodos getBytes, mas pessoalmente eu não gosto de apenas trabalhar com os nomes de codificação de caracteres. Muito espaço para erros de digitação.)
EDIT: Como foi salientado nos comentários, você ainda pode usar instâncias Charset, mas têm a facilidade de uso dos métodos de corda: new string (bytes, charset) e cadeia. getBytes (charset) .
Consulte " URL codificação (ou: 'Quais são os "códigos %20
" em URLs?) ".
Outras dicas
CharsetDecoder
deve ser o que você está procurando, não?
Muitos protocolos de rede e arquivos armazenar seus personagens com uma personagem orientada a byte definido como ISO-8859-1
(ISO-Latin-1
).
No entanto, a codificação de caracteres nativo do Java é Unicode UTF16BE (dezesseis bit UCS Transformation Format, ordem de bytes big-endian).
Charset
. Isso não significa UTF16
é a codificação padrão (ou seja: o padrão "mapeamento entre seqüências de dezesseis-bit noreferrer unidades de código Unicode > fortes e sequências de bytes"):
Cada instância da máquina virtual Java tem um conjunto de caracteres padrão, que pode ou não ser um dos conjuntos de caracteres padrão.
[US-ASCII
,ISO-8859-1
A.K.A.ISO-LATIN-1
,UTF-8
,UTF-16BE
,UTF-16LE
,UTF-16
]
O charset padrão é determinado durante a inicialização de máquina virtual e, normalmente, depende do local e charset a ser utilizado pelo sistema operacional subjacente.
Este exemplo demonstra como converter ISO-8859-1
bytes codificados em um ByteBuffer
a uma corda em um CharBuffer
e vice-versa.
// Create the encoder and decoder for ISO-8859-1
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();
try {
// Convert a string to ISO-LATIN-1 bytes in a ByteBuffer
// The new ByteBuffer is ready to be read.
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("a string"));
// Convert ISO-LATIN-1 bytes in a ByteBuffer to a character ByteBuffer and then to a string.
// The new ByteBuffer is ready to be read.
CharBuffer cbuf = decoder.decode(bbuf);
String s = cbuf.toString();
} catch (CharacterCodingException e) {
}
Eu gostaria apenas de acrescentar que se a cadeia é originalmente codificados usando o errado codificação pode ser impossível mudá-lo para outra codificação sem erros. A questão não indica que a conversão aqui é feito de codificação errada para codificação correta, mas eu, pessoalmente, tropeçou a esta pergunta só porque dessa situação de modo a apenas um heads-up para os outros também.
Esta resposta em outra pergunta dá uma explicação de por que a conversão nem sempre produz resultados corretos https://stackoverflow.com/a/2623793/4702806
É muito mais fácil se você pensar em unicode como um conjunto de caracteres (que ele realmente é - é muito basicamente o conjunto numerado de todos os caracteres conhecidos). Pode codificá-lo como UTF-8 (1-3 bytes por caractere dependendo) ou talvez UTF-16 (2 bytes por caracteres ou 4 bytes utilizando pares de substituição).
De volta à névoa do tempo Java costumava usar UCS-2 para codificar o conjunto de caracteres Unicode. Isso só poderia lidar com 2 bytes por caractere e agora está obsoleta. Era um truque bastante óbvio para adicionar pares substitutos e mover-se para UTF-16.
Muitas pessoas pensam que deve ter UTF-8 utilizado em primeiro lugar. Quando Java foi originalmente escrito unicode tinha muito mais do que 65535 caracteres de qualquer maneira ...
UTF-8 e UCS-2 / UTF-16 podem ser distinguidos razoavelmente facilmente através de uma marca de ordem de byte no início do arquivo. Se isso existe, então é uma boa aposta bastante que o arquivo está em que a codificação - mas não é uma certeza morta. Você pode muito bem também achar que o arquivo está em uma dessas codificações, mas não tem uma marca de ordem de bytes.
Eu não sei muito sobre ISO-8859-2, mas eu não ficaria surpreso se quase todos os arquivo é um arquivo de texto válida em que a codificação. O melhor que você vai ser capaz de fazer é verificar que heuristicamente. De fato, a página da Wikipedia falar sobre isso sugeriria que só byte 0x7f é inválido.
Não há nenhuma idéia de ler um arquivo "como é" e ainda recebendo texto para fora -. Um arquivo é uma seqüência de bytes, então você tem que aplicar uma codificação de caracteres a fim de decodificar os bytes em caracteres
Fonte de stackoverflow