UTF-8编码转换非英文字符失效及字节数组转字符串问题求助
解决UTF-8解码非英文字符乱码的问题
先给你捋清楚为啥会出现这种差异:
- 当你用
new String(bytearray)时,JVM会自动用系统默认字符编码来解码字节数组。刚好你的环境默认编码能正确解析带ó的字节,所以结果是对的。 - 但
new String(bytearray, StandardCharsets.UTF_8)是强制用UTF-8解码,如果你的字节数组本身不是UTF-8编码的,解码失败就会出现�这种替换字符。
举个实际的例子:假设你的bytearray是用ISO-8859-1编码生成的:
// 用ISO-8859-1把字符串转成字节数组 byte[] bytearray = "Impresión".getBytes(StandardCharsets.ISO_8859_1); // 强行用UTF-8解码就会乱码 String wrongResult = new String(bytearray, StandardCharsets.UTF_8); // 得到"Impresi�n" // 用对应的ISO-8859-1解码才正确 String correctResult = new String(bytearray, StandardCharsets.ISO_8859_1); // 得到"Impresión"
具体解决步骤:
先搞清楚字节数组的原始编码
- 去查生成这个
bytearray的代码,看它是用什么编码把字符串转成字节的(比如有没有指定getBytes()的参数,无参的话用的是系统默认编码)。 - 如果找不到来源,可以试试用常见编码(比如ISO-8859-1、Windows-1252、UTF-16)解码测试,哪个能得到正确的"Impresión",那就是对应的编码。
- 去查生成这个
编码和解码必须配对使用
- 如果你的目标是全程用UTF-8处理,那生成字节数组时就要明确指定UTF-8:
// 生成UTF-8编码的字节数组 byte[] utf8Bytes = "Impresión".getBytes(StandardCharsets.UTF_8); // 再用UTF-8解码就不会乱码 String correctResult = new String(utf8Bytes, StandardCharsets.UTF_8); - 如果字节数组已经是其他编码,解码时就得用对应的编码,不能硬套UTF-8。比如原始是Windows-1252编码的:
String correctResult = new String(bytearray, Charset.forName("Windows-1252"));
- 如果你的目标是全程用UTF-8处理,那生成字节数组时就要明确指定UTF-8:
尽量别依赖系统默认编码
系统默认编码在不同操作系统(Windows/Linux/macOS)可能不一样,所以不管是编码还是解码,都最好显式指定字符集,别用无参的getBytes()或new String(bytearray),这样能避免换环境就乱码的坑。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

