字符编码介绍

编码:
ASCII码一共规定了128个字符的编码,英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的.
简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。
将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,这就是Unicode
Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。
因为都是用二进制去表示符号,但怎么区别Unicode和ASCII编码?以及根据不同语言,采用不同字节数去表示,例如英文就不需要用多于1个字节去表示
所以就有了UTF-8的,是Unicode的实现方式之一。了解UTF-8的编码规则就清楚怎么解决上面的问题。

UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8 的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

一个utf8数字占1个字节
一个utf8英文字母占1个字节
少数是汉字每个占用3个字节,多数占用4个字节。


参考:https://blog.csdn.net/vevenlcf/article/details/45255739
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
为什么没有unicode 转 utf8的线上程序?在http://tool.chinaz.com/tools/utf-8.aspx中文转utf8里有&#。
是在网页中&#开头的是HTML实体https://blog.csdn.net/phpdadao/article/details/22871559
乱码
https://blog.csdn.net/javajiawei/article/details/70255880
http://cenalulu.github.io/linux/character-encoding/
https://blog.csdn.net/wfmdyh/article/details/72722709#没试成
自动检测编码:
http://blog.sina.com.cn/s/blog_5258e1360102vikh.html
https://www.v2ex.com/amp/t/451260
https://segmentfault.com/q/1010000000185278
https://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652567752&idx=1&sn=81091f3c21f7159b27a6308244762025

base64编码:
大体流程是:字符->二进制->base64编码
3个字节为一组分割成4个字节,然后用base64码表编码表示,不够3个字节的用=代替。
Base64将三个字节转化成四个字节,因此Base64编码后的文本,会比原文本大出三分之一左右。
参考:http://www.ruanyifeng.com/blog/2008/06/base64.html
思考:为什么要3个字节为一组分割成4个字节?
因为3个字节代表了普遍字符,如utf8编码汉字等。
分割成4个字节,变成6位,而2^6=64,刚好6位可以表示完base64的码表。
解码:用http://tool.chinaz.com/tools/base64.aspx解码有时会出现乱码�
首先要明确知道base64解码成的是原来的二进制,所以如何再编码二进制,是不关base64事情的。
utf8编码成二进制的话,那前面第一位通常是标记位,而gbk可能就不是。
所以例如原本是utf8->binary->base64,然后解码base64->binary->gbk,那就会出现乱码
应该同样用utf8编码base64解码出来的二进制。所以原因是chinaz默认是utf8编码。
参考:https://blog.csdn.net/shsalex/article/details/52104898
Base64是一种数据编码方式,主要不是为了加密数据,是为了传输的安全性,不被错误编码。
例如post请求的payload里存在&,/等对于URL来说是特殊字符的。还有迅雷的thunder://。
图片:当然也可以图片转base64传输,减少网络加载图片的负载。图片实际也是二进制,可转Base64.

有了UTF-8编码,为啥还有Base64编码:
utf-8主要是对文本内容的编码,Base64编码是对所有二进制数据编码,例如图片文件等,主要便于传输。
https://mp.weixin.qq.com/s/B7n996vMzZI4qxFOSkMzTQ

HTTP协议-压缩:(也可理解成编码)
在一些请求返回的内容Content-Encoding:deflate或identity时,没有gzip时,可能一些请求库就解压不了返回的内容。
https://kb.cnblogs.com/page/163781/HTTP
https://www.cnblogs.com/fjdingsd/p/4691451.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值