UTF-8字符串将非英语字符转换为无效字符

时间:2018-04-04 14:28:25

标签: java arrays string encoding utf-8

我正在使用UTF-8编码将字节数组转换为字符串

new String(bytearray, StandardCharsets.UTF_8));

它将字符串Impresión更改为Impresi�n。但如果我执行下面的代码

new String(bytearray);

它为Impresión

提供了正确的字符串Impresión

我想制作UTF-8编码字符串而不将任何非英文字符更改为无效字符。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

Java中的String对象使用UTF-16编码, cant 可以修改。

如果您需要使用备用编码中的字符,则必须使用menu = self.sm.get_screen('menu') self.sm.remove_widget(menu) 数组来存储数据,并在将其转换为字符串时,请确保指定与之相同的编码编码字节数组。

因此,当您从字节数组构造字符串时,必须确保该字符串知道如何将其编码为原始编码所用的UTF-16。这就是为什么你的第一个代码不能像你指定原始编码的构造函数一样工作,并且显然它不是正确的编码,因此java无法正确解码字节数组。但是在第二个代码中你没有指定编码,因此java使用系统上的默认编码,其中probaly是用于编码字节数组的相同编码,因此生成正确的字符。

要解决此问题,请确保使用与将字节数组解码为字符串时指定的编码相同的编码对字节数组进行编码。

有关更多信息,请参阅以下链接,特别是他们使用UTF-16编码撰写有关字符串的介绍:

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

答案 1 :(得分:3)

格式发生变化,因为源字节数组不是UTF-8编码的。 以下代码适用于我。

    byte[] bytearray = "Impresión".getBytes(StandardCharsets.UTF_8);
    String s = new String(bytearray, StandardCharsets.UTF_8);
    System.out.println(s);

,输出

Impresión

但是当我在代码下面运行时

byte[] bytearray = "Impresión".getBytes();
String s = new String(bytearray, StandardCharsets.UTF_8);
System.out.println(s);

打印

Impresi?n

您需要使用相同的字符集进行编码和解码。