encode decode介绍,为什么会出现乱码呢?如何准确检查字符长度?

[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();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值