目录

常见 编码 与 解码
字符 编码
将字符串→字节序列
byte[] b_utf8 = "知".getBytes("UTF-8"); // [-25, -97, -91]
byte[] b_gbk = "知".getBytes("GBK"); // [-42, -86]
byte[] b_unicode = "知".getBytes("unicode"); // [-2, -1, 119, -27]
byte[] b_iso88591 = "知".getBytes("ISO8859-1"); // [63] 所有中文都是这个数值,因为不识别
String s_utf8 = new String(b_utf8, "UTF-8"); // 知
String s_gbk = new String(b_gbk, "GBK"); // 知
String s_unicode = new String(b_unicode, "unicode"); // 知
String s_iso88591 = new String(b_iso88591, "ISO8859-1"); // ? encode都是不对的,decode指定是错的
URL 编码
将字符串→被特殊处理的字符串(非字节序列)
String str = URLEncoder.encode("知", "utf-8"); // %E7%9F%A5
String str = URLDecoder.decode("%E7%9F%A5", "utf-8"); // 知
Base64 编码
将字符串→编码后的字符串(非字节序列)
import java.nio.charset.StandardCharsets;
import java.util.Base64;
byte[] bytesToEncode = originalString.getBytes(StandardCharsets.UTF_8);
String encodedString = Base64.getEncoder().encodeToString(bytesToEncode);
// Hello, World! → SGVsbG8sIFdvcmxkIQ==
--------------------------------------------------
import java.nio.charset.StandardCharsets;
import java.util.Base64;
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String originalString = new String(decodedBytes, StandardCharsets.UTF_8);
// SGVsbG8sIFdvcmxkIQ== → Hello, World!
JSON 编码(JavaScript Object Notation)
对象→JSON 格式的字符串
什么是序列化与反序列化?
[实践总结] Json 和 JavaObject 互相转换

[Q&A] 为什么会出现乱码呢?
编码 和 解码 时用了不同或者不兼容的字符集。
[Q&A] UTF-8 为何被视为字符集?
UTF-8 是一种编码规则,而不是字符集。早期字符集和编码规则的概念没有严格区分,再加上这种用法已经深入人心。可以直接指定 charset=UTF-8 表示UTF-8 与 Unicode 的组合。

应用场景
字节数组作为中间编码
# 为了让中文字符适应某些特殊要求(如http header头要求其内容必须为iso8859-1编码)
String aaa = new String("知".getBytes("UTF-8"), "ISO8859-1");
//把 '知' 按照 UTF-8 encode ---> [-25, -97, -91] 再按照 ISO8859-1 decode 成 乱码'知'
String bbb = new String(aaa.getBytes("ISO8859-1"), "UTF-8");
//把乱码'知' 按照 ISO8859-1 encode ---> [-25, -97, -91], 再按照 UTF-8 decode 成 '知'
准确检查字符长度
在开发时会检查字符长度,以免数据库字段的长度不够而报错,考虑到中英文的差异,肯定不能用String.length()方法判断,而需采用String.getBytes().length;还可以用指定编码方式查看长度String.getBytes("GBK").length。
获取jdk的 charset
Set<String> charsetNames = Charset.availableCharsets().keySet();
本文详细介绍了字符编码的概念,包括Unicode和UTF-8的区别与转换过程。通过举例说明了在文本编辑、网页浏览中的角色,以及编码、解码过程中可能出现的乱码问题。强调了在处理字符串到字节数组、字节数组到字符串的转换时,正确选择编码方式的重要性,并提供了检查字符串长度和获取JDK字符集的方法。
1139

被折叠的 条评论
为什么被折叠?



