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

Java UTF-8字符串将非英语字符转换为无效字符,java,arrays,string,encoding,utf-8,Java,Arrays,String,Encoding,Utf 8,我正在使用UTF-8编码将字节数组转换为字符串 new String(bytearray, StandardCharsets.UTF_8)); 它将字符串Impresión更改为Impresión�n。但是如果我执行下面的代码 new String(bytearray); 它将适当的字符串Impresión提供给Impresión 我想在不将任何非英语字符更改为无效字符的情况下生成UTF-8编码字符串 任何帮助都将不胜感激 Java中的字符串对象使用UTF-16编码,不能修改 如果需要使用替

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

new String(bytearray, StandardCharsets.UTF_8));
它将字符串
Impresión
更改为
Impresión�n
。但是如果我执行下面的代码

new String(bytearray);
它将适当的字符串
Impresión
提供给
Impresión

我想在不将任何非英语字符更改为无效字符的情况下生成UTF-8编码字符串


任何帮助都将不胜感激

Java中的字符串对象使用UTF-16编码,不能修改

如果需要使用替代编码中的字符,则必须使用
字节[]
数组来存储数据,并且在将其转换为字符串时,确保指定的编码与对字节数组进行编码时使用的编码相同

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

要解决此问题,请确保字节数组的编码方式与将字节数组解码为字符串时指定的编码方式相同

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


由于源字节数组未进行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

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

-“通过使用平台的默认字符集对指定的字节数组进行解码来构造新字符串。”您的平台默认字符集可能不是UTF-8(例如Windows)。如果您的字符串在平台的默认字符集中,而不是UTF-8中,那么这种行为是可以理解的。您确定
Impresi�n
不仅仅是输出毒刺的外壳的工件吗?不久前,我在mysql和bash上遇到了这样的问题。@luksch我确信这不是来自shell输出。。。� 是对指定的编码无效的字节的替换字符。在这种情况下,它确实帮助了您(尽管在我看来,例外情况会更好)。� 向用户表明您错误处理了他们的数据并丢失了部分数据。那么,
bytearray
中文本的字符编码是什么?嗨@TomBlodget。这是西班牙语文本,我正在尝试从bytearray转换为字符串。当使用UTF_8时,它会产生无效字符。我不知道其他编码中的字符在unicode中不存在,因此在UTF-16中也不存在。因此,是的,您可以将其他编码的字符存储在java字符串中,但必须注意正确转换。。。