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.

Foi útil?

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

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