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

Kum*_*mar 3 java arrays string encoding utf-8

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

\n\n
new String(bytearray, StandardCharsets.UTF_8));\n
Run Code Online (Sandbox Code Playgroud)\n\n

它将字符串更改Impresi\xc3\xb3nImpresi\xef\xbf\xbdn. 但是如果我执行下面的代码

\n\n
new String(bytearray);\n
Run Code Online (Sandbox Code Playgroud)\n\n

Impresi\xc3\xb3n它给出了正确的字符串Impresi\xc3\xb3n

\n\n

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

\n\n

任何帮助,将不胜感激。

\n

Ste*_*Toe 5

Java中的字符串对象使用UTF-16编码,无法修改。

如果您需要使用备用编码中的字符,则必须使用数组byte[]来存储数据,并且当您将其转换为字符串时,请确保指定用于对字节数组进行编码的相同编码。

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

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

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

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