Como converter caracteres UTF-8 para ISO Latin 1?

votos
5

Eu preciso converter um sinal de marca UTF-8 para um Latina ISO 1, e guardá-lo no banco de dados, que também é ISO Latin 1 codificado.

Como posso fazer isso em java?

Eu tentei algo como

String s2 = new String(s1.getBytes(ISO-8859-1), utf-8);

mas não parece trabalhar como eu esperava.

Publicado 11/03/2009 em 15:25
fonte usuário
Em outras línguas...                            


4 respostas

votos
5

Uma string em Java está sempre em Unicode (UTF-16, de forma eficaz). Conversões só são necessárias quando você está tentando ir de texto para a codificação binária ou vice-versa.

Qual é o personagem envolvido? Tem certeza que é ainda presente na ISO Latin 1? Se for, eu esperaria que o personagem a ser armazenado por seu banco de dados sem qualquer problema. Não há tal coisa como um "sinal de marca UTF-8". Você poderia ter "os bytes que representa o sinal de marca UTF-8 codificado", mas que seria um array de bytes, não uma string.

EDIT: Se você quer dizer o caráter marca Unicode U + 2122, que está fora da faixa de ISO-Latin-1. Há o caráter marca registrada U + 00AE, que não é a mesma coisa (seja na aparência ou no sentido legal, IIRC), mas pode ser melhor do que nada - se você quiser usar isso, então é só usar:

string replaced = original.replace('\u2122', '\u00ae');
Respondeu 11/03/2009 em 15:29
fonte usuário

votos
2
  1. Leia o que Jon Skeet disse. O código que você postou é lixo (que toma a forma codificada UTF-8 do seu Cordas e interpreta-o como se fosse ISO-8859-1, este nada de útil realiza).
  2. A codificação ISO-8859-1 (aka Latin1) não contém o caráter da marca registrada "™".
Respondeu 11/03/2009 em 15:34
fonte usuário

votos
0

Eu tive um problema semelhante e resolvido convertendo os os caracteres nenhum traduzível em Entitys. Se você exibir as informações mais tarde como html você está bem de qualquer maneira.

Se não, você poderia tentar convertê-los de volta para unicode.

exemplo em python com o "Marca":

s = u'yellow bananas\u2122'.encode('latin1', 'xmlcharrefreplace')
# s is 'yellow bananas™'
Respondeu 22/02/2012 em 11:11
fonte usuário

votos
4

Tanto quanto eu entendo, você está tentando armazenar caracteres (de s1) que contém caracteres não Latin-1 em um banco de dados que suporta apenas ISO-8859-1.

  • Em primeiro lugar, concordo com os outros a dizer que é uma idéia suja.
    Note-se que CP1252 é perto da ISO-8859-1 (um byte por caractere) e inclui

  • Agora, para anwser sua pergunta, eu acho que você fez o oposto ..
    Você deseja codificar UTF-8 bytes em ISO-8859-1:

    String s2 = new String(s1.getBytes("UTF-8"), "ISO-8859-1");
    

    Desta forma, s2é uma cadeia characher que, uma vez codificada na norma ISO-8859-1, retornará uma matriz de bytes que pode parecer válidos UTF-8 bytes.

    Para recuperar a string original, você faria

    String s1 = new String(s2.getBytes("ISO-8859-1"),"UTF-8");
    

MAS ESPERE ! Ao fazer isso, você espero que qualquer byte pode ser decodificado com ISO-8859-1 .. e que a sua DB aceitará tais dados. etc ..

Na verdade, é realmente inseguro porque oficialmente, ISO-8859-1 não tem caracteres para quaisquer valores de byte . Por exemplo, de 80 a 9F.

Então,

byte[] b = { -97, -100, -128 };
System.out.println( new String(b,"ISO-8859-1") );

exibiria ???

No entanto, em Java , s.getBytes("ISO-8859-1")na verdade, restaura a matriz inicial.

Respondeu 20/02/2014 em 13:42
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more