java中字符串base64编解码应使用java.util.base64,编码需先用standardcharsets.utf_8转字节数组再encodetostring,解码需用getdecoder().decode后以相同字符集构造字符串;url场景用geturlencoder/decoder;严禁省略字符集或混淆编码器类型。

Java 中编码与解码不是单一操作,而是分场景、分目的、分数据类型的系统性实践。核心原则就一条:**字节是桥梁,编码/解码本质是字符 ↔ 字节的双向映射,必须显式指定 Charset,且两端严格一致**。
Base64 编解码:用标准库,别碰 sun.misc
Java 8+ 唯一推荐方案是 java.util.Base64,它提供三类编码器:
-
标准编码:
Base64.getEncoder(),适合通用字符串或二进制数据转文本(如 HTTP Authorization 头) -
URL 安全编码:
Base64.getUrlEncoder(),把+和/换成-和_,不加换行,适合 URL 参数、文件名、JWT payload -
MIME 编码:
Base64.getMimeEncoder(),每 76 字符加\r\n,仅用于邮件协议等旧场景,日常基本不用
⚠️ 关键避坑点:
- 绝不能对字符串直接 new String(bytes) 再编码——这会受平台默认编码(如 Windows 的 GBK)污染字节流
- 正确做法永远基于 byte[]:
str.getBytes(StandardCharsets.UTF_8)编码,new String(decodedBytes, StandardCharsets.UTF_8)解码 - 老项目迁移时若报
NoClassDefFoundError: sun/misc/BASE64Encoder,说明还在用已移除的内部 API,必须替换为java.util.Base64
URL 编码与解码:URLEncoder 不是万能拼接工具
URLEncoder.encode() 设计目标是编码表单参数(application/x-www-form-urlencoded),不是构造完整 URL:
- 它把空格转成
+、斜杠/转成%2F,若用在路径中(如/user/张三),会导致语义错误 - 乱码主因是漏写字符集参数——默认按 ISO-8859-1 编码,而中文是 UTF-8 字节流,必须显式写
URLEncoder.encode("张三", "UTF-8") - 解码时也必须用相同字符集:
URLDecoder.decode(encoded, "UTF-8") - 更安全的做法是用
java.net.URI构造器,它自动区分 scheme、host、path、query 等部分并做合规编码
文本文件读写:用 InputStreamReader / OutputStreamWriter 显式声明编码
文件 I/O 是编码错误高发区,尤其跨平台或含中文时:
- 不要依赖系统默认编码(
new FileReader()或new FileWriter()底层用的是平台默认 Charset,Windows 是 GBK,Linux/macOS 是 UTF-8) - 正确方式是包装字节流:
new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"), StandardCharsets.UTF_8)) - 写入同理:
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"), StandardCharsets.UTF_8)) - 如果用 NIO.2,可直接用
Files.readAllLines(path, UTF_8)和Files.write(path, lines, UTF_8)
二维码编解码:靠 ZXing,不是 Base64
QRCode 是图像级编码,和字符编码无关,需专用库:
- 主流选择是 Google 的 ZXing(Maven 坐标
com.google.zxing:core+javase) - 编码:输入字符串 → 构建
QRCodeWriter→ 生成BitMatrix→ 渲染为BufferedImage - 解码:读取图像(
BufferedImage)→ 构建BinaryBitmap→ 用MultiFormatReader解析 → 得到原始字符串 - 注意:ZXing 默认只识别 QR Code,如需支持条形码等,要传入对应
DecodeHintType
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











