[Q&A] Unicode 和 二进制数据 何时切换?
计算机内存
中统一使用Unicode
,使用 UTF-8
编码为二进制数据
然后保存到硬盘
/传输
。
例如:用记事本编辑的时候:
读:文件(二进制数据)→(UTF-8解码)→内存(Unicode字符)
存:内存(Unicode字符)→(UTF-8编码)→文件(二进制数据)
例如:浏览网页的时候:
服务器会把动态生成的Unicode内容→(UTF-8编码)→(二进制数据)传输→(UTF-8解码)→Unicode内容到浏览器
[Q&A] encode 和 decode 的作用
encode作用:将字符串
编码成字节串
decode作用:将字节串
编码成字符串
URLEncoder.encode("知", "utf-8"); // %E7%9F%A5
URLDecoder.decode("%E7%9F%A5", "utf-8"); // 知
[Q&A] 为什么会出现乱码呢?
编码 (encode) 和 解码(decode) 时用了不同
或者不兼容
的字符集。
场景应用
1・字符串 编码成→ 字节数组
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] 所有中文都是这个数值,因为不识别
2・字节数组 解码成→ 字符串
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指定是错的
3・字节数组作为中间编码
为了让中文字符适应某些特殊要求(如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 成 '知'
4・如何准确检查字符长度?
在开发时会检查字符长度,以免数据库字段的长度不够而报错,考虑到中英文的差异,肯定不能用String.length()
方法判断,而需采用String.getBytes().length
;还可以用指定编码方式查看长度String.getBytes("GBK").length
5・获取jdk的 charset
Set<String> charsetNames = Charset.availableCharsets().keySet();