java string编码
Java String 编码指的是 Java 中字符串与字节序列之间转换时采用的字符编码规则,它和 `String`、`byte[]`、`InputStream`/`OutputStream` 以及 `Charset` 类密切相关。简单说,就是同样一段文字,按 UTF-8、GBK 或 ISO-8859-1 转成字节时结果不同,读回来时若编码不一致就会出问题。
基本含义与常见用途
Java 的 `String` 内部以 Unicode 保存字符,但文件、网络传输、数据库存储往往以字节形式存在。用 `getBytes(charset)` 把字符串编码成字节,用 `new String(bytes, charset)` 把字节解码成字符串,这是最常见的两个操作。读写文件时,`InputStreamReader`、`OutputStreamWriter` 需要指定字符集;处理 HTTP 请求响应时,也要关注 `Content-Type` 里的 charset 参数。明确指定编码,能避免依赖平台默认值带来的不确定性。
常见问题
最典型的是乱码:用 UTF-8 写入、用 GBK 读取,中文就会变成问号或奇怪符号。其次是“默认编码”陷阱,`getBytes()` 不传参数时使用平台默认字符集,同一段代码在 Windows 和 Linux 上结果可能不同。还有把字节数组直接拼成字符串、或在转换中丢失不可映射字符,也会造成数据损坏。另外,`ISO-8859-1` 只能表示单字节字符,用它处理中文必然出错。
怎么判断与怎么选
判断问题可以先看数据来源和去向的编码声明:文件头、HTTP 头、数据库连接参数、日志里的字符集信息。排查时把字符串按字节打印出来,对比预期编码的字节序列,能快速定位是哪一步不一致。选择上,跨平台和网络传输优先用 UTF-8;与旧系统或特定中文环境交互时,按对方实际编码处理,并在代码中显式写出字符集名,不要依赖默认值。统一约定“入口按声明解码、出口按约定编码”,大多数编码问题都能避免。