在Java中如何将文本从ISO-8859-1编码转换为UTF-8编码?
Java ISO-8859-1 编码转 UTF-8 实现方案
核心逻辑
ISO-8859-1 是单字节编码,覆盖的字符对应 Unicode 码表的前256位,需求中提到的字符Á在两个编码体系下的 Unicode 码点完全一致(均为 U+00C1),仅底层字节存储规则不同,无需手动调整 Unicode 值,只要按规则完成「解码-编码」流程即可保证字符显示完全一致。
标准实现代码
import java.nio.charset.StandardCharsets; public class EncodingConvertUtil { /** * 将ISO-8859-1编码的字节数组转换为UTF-8编码的字节数组 * @param isoBytes ISO-8859-1编码的输入字节 * @return UTF-8编码的输出字节 */ public static byte[] convertIsoToUtf8(byte[] isoBytes) { // 第一步:用ISO-8859-1规则解码字节得到Unicode字符串 String rawStr = new String(isoBytes, StandardCharsets.ISO_8859_1); // 第二步:将Unicode字符串按UTF-8规则编码为字节 return rawStr.getBytes(StandardCharsets.UTF_8); } /** * 直接从ISO-8859-1编码的字节中得到可正常显示的Java字符串 * @param isoBytes ISO-8859-1编码的输入字节 * @return 可正常显示的字符串 */ public static String getNormalString(byte[] isoBytes) { return new String(isoBytes, StandardCharsets.ISO_8859_1); } // 测试用例 public static void main(String[] args) { // 字符Á在ISO-8859-1编码下的字节值为0xC1 byte[] isoInput = new byte[]{(byte) 0xC1}; String result = getNormalString(isoInput); System.out.println(result); // 输出 Á,显示完全正常 byte[] utf8Output = convertIsoToUtf8(isoInput); // 字符Á在UTF-8编码下占2字节,输出长度为2符合预期 System.out.println(utf8Output.length); } }
注意事项
- 禁止直接将 ISO-8859-1 字节数组用 UTF-8 规则解码,会生成不可修复的乱码字符
� - 优先在读取数据源时直接指定编码,避免后续转码:比如读取文件/网络流时,给
InputStreamReader构造参数传入StandardCharsets.ISO_8859_1,可以直接拿到正确的字符串 - 仅当初次解码时错误用 ISO-8859-1 解码了 UTF-8 字节导致乱码时,才能用反向转码修复:
new String(wrongStr.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8),如果是 ISO 字节被错误用 UTF-8 解码,乱码无法修复
内容的提问来源于stack exchange,提问作者Thiago Souza
相关产品推荐
相关产品推荐

