Como faço para converter entre ISO-8859-1 e UTF-8 em Java?

votos
58

Alguém sabe como converter uma seqüência de ISO-8859-1 para UTF-8 e volta em Java?

Eu estou recebendo uma string a partir da web e salvá-lo na RMS (J2ME), mas eu quero preservar os caracteres especiais e obter a seqüência do RMS, mas com a codificação ISO-8859-1. Como eu faço isso?

Publicado 16/03/2009 em 22:09
fonte usuário
Em outras línguas...                            


7 respostas

votos
88

Em geral, você não pode fazer isso. UTF-8 é capaz de codificar para qualquer ponto de código Unicode. ISO-8859-1 pode lidar com apenas uma pequena fracção delas. Assim, a transcodificação de ISO-8859-1 para UTF-8 não é problema. Indo para trás a partir UTF-8 para ISO-8859-1 fará com "caracteres de substituição" () para aparecer em seu texto quando caracteres não suportados são encontrados.

Para transcodificar texto:

byte[] latin1 = ...
byte[] utf8 = new String(latin1, "ISO-8859-1").getBytes("UTF-8");

ou

byte[] utf8 = ...
byte[] latin1 = new String(utf8, "UTF-8").getBytes("ISO-8859-1");

Você pode exercer mais controle usando as de nível inferior CharsetAPIs. Por exemplo, você pode gerar uma exceção quando um personagem não-encodable for encontrado, ou usar um caractere diferente para texto de substituição.

Respondeu 16/03/2009 em 23:21
fonte usuário

votos
7

Que trabalhou para mim: ( "üzüm Baglari" é a correta escrita em turco)

Converter ISO-8859-1 para UTF-8:

String encodedWithISO88591 = "üzüm baÄları";
String decodedToUTF8 = new String(encodedWithISO88591.getBytes("ISO-8859-1"), "UTF-8");
//Result, decodedToUTF8 --> "üzüm bağları"

Converter UTF-8 com a norma ISO-8859-1

String encodedWithUTF8 = "üzüm bağları";
String decodedToISO88591 = new String(encodedWithUTF8.getBytes("UTF-8"), "ISO-8859-1");
//Result, decodedToISO88591 --> "üzüm baÄları"
Respondeu 12/08/2016 em 08:45
fonte usuário

votos
6

Se você tem um String, você pode fazer isso:

String s = "test";
try {
    s.getBytes("UTF-8");
} catch(UnsupportedEncodingException uee) {
    uee.printStackTrace();
}

Se você tiver um 'quebrado' String, você fez algo errado, convertendo um Stringa um Stringem uma outra codificação não é defenetely o caminho a percorrer! É possível converter um Stringpara um byte[]e vice-versa (dado uma codificação). Em Java Strings são AFAIK codificado com UTF-16mas isso é um detalhe de implementação.

Digamos que você tenha um InputStream, você pode ler em um byte[]e depois convertê-lo em um Stringusando

byte[] bs = ...;
String s;
try {
    s = new String(bs, encoding);
} catch(UnsupportedEncodingException uee) {
    uee.printStackTrace();
}

ou ainda melhor (graças a Erickson) use InputStreamReaderassim:

InputStreamReader isr;
try {
     isr = new InputStreamReader(inputStream, encoding);
} catch(UnsupportedEncodingException uee) {
    uee.printStackTrace();
}
Respondeu 16/03/2009 em 22:30
fonte usuário

votos
3

Aqui está uma maneira fácil com saída String (I criou um método para fazer isso):

public static String (String input){
    String output = "";
    try {
        /* From ISO-8859-1 to UTF-8 */
        output = new String(input.getBytes("ISO-8859-1"), "UTF-8");
        /* From UTF-8 to ISO-8859-1 */
        output = new String(input.getBytes("UTF-8"), "ISO-8859-1");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return output;
}
// Example
input = "Música";
output = "Música";
Respondeu 13/06/2016 em 17:24
fonte usuário

votos
1

Regex também pode ser bom e ser utilizada de forma eficaz (Substitui todos os caracteres UTF-8 não abrangidos no ISO-8859-1com espaço):

String input = "€Tes¶ti©ng [§] al€l o€f i¶t _ - À ÆÑ with some 9umbers as"
            + " w2921**#$%!@# well Ü, or ü, is a chaŒracte⚽";
String output = input.replaceAll("[^\\u0020-\\u007e\\u00a0-\\u00ff]", " ");
System.out.println("Input = " + input);
System.out.println("Output = " + output);
Respondeu 21/11/2018 em 17:43
fonte usuário

votos
0

Aqui está uma função para converter UNICODE (ISO_8859_1) para UTF-8

public static String String_ISO_8859_1To_UTF_8(String strISO_8859_1) {
final StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < strISO_8859_1.length(); i++) {
  final char ch = strISO_8859_1.charAt(i);
  if (ch <= 127) 
  {
      stringBuilder.append(ch);
  }
  else 
  {
      stringBuilder.append(String.format("%02x", (int)ch));
  }
}
String s = stringBuilder.toString();
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
    data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                         + Character.digit(s.charAt(i+1), 16));
}
String strUTF_8 =new String(data, StandardCharsets.UTF_8);
return strUTF_8;
}

TESTE

String strA_ISO_8859_1_i = new String("الغلاف".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);

System.out.println("ISO_8859_1 strA est = "+ strA_ISO_8859_1_i + "\n String_ISO_8859_1To_UTF_8 = " + String_ISO_8859_1To_UTF_8(strA_ISO_8859_1_i));

RESULTADO

ISO_8859_1 strA est = اÙغÙا٠String_ISO_8859_1To_UTF_8 = الغلاف

Respondeu 30/10/2018 em 14:52
fonte usuário

votos
0

Apache Commons IO classe Charsets pode vir a calhar:

String utf8String = new String(org.apache.commons.io.Charsets.ISO_8859_1.encode(latinString).array())
Respondeu 06/04/2017 em 13:03
fonte usuário

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