序
编写一篇满意的文章,需要不停琢磨,耗时良久。
本文正在编写中,可参考本文中的链接,本文内容杂乱,可先掠过。
之所以不放草稿箱,是为了激励自己以通俗语言早日编写完此文.
这些都是我自己的理解,最好还是参考一下百度百科和维基百科,在我查找相关资料的过程中,发现有一些解释说的是是而非,对也对,错也错,尽信书不如无书。
本文目标:
- 在前端把utf-8转码为gbk或者gb18030 (已实现)
- 求出所转后字节的长度(已实现)
- 都有什么工具可查看字符的各种编码和长度(已实现)
- form的accetpcharset到底有什么属性?iso、gbk、utf-8?(已实现)
工具、概念
好文!!!: utf8和gb18030的区别
强烈建议使用:本文作者写的解码页面----(https://1078559858.github.io/makeWheels/project/encode/encode.html)
gb2312\gbk\gb18030 在线转换
utf8\unicode\utf16\utf32 在线转换
unicode、iso编码的历史
unicode详解
好文!
Unicode和UTF的关系
IBM:Unicode 字符编码
Unicode(UTF-8, UTF-16)令人混淆的概念
前言
ascii
unicode
- unicode是一种编码格式,对世界上每一个字符都设置了对应的编码。
- unicode的默认编码格式是utf-16,传输比较浪费空间,所以现在用utf8的比较多
- GB18030 是中国的标准,国标(GB),就是如何表示一个字符。Unicode只给出了一个字符的编号,并没有规定如何表示(或者说保存),UTF-8规定了如何表示。所以说,GB18030 和 unicode+utf-8 是不同的字符表示方式,一个是中国制定的标准,一个是国际上的组织制定的标准
ascii和 unicode的关系
- ascii只有127个字母,为了兼容中文有了gb2312,那日文、韩文呢?要统一世界语言,就有了unicode编码
- unicode编码表示英文是八位,而ascii是7位,空间变大一倍。于是有了utf-8可伸缩长度的编码
ascii和iso 8895的关系
- ascii是7位字符集,iso 8895是一系列8位元字符集的标准,现时定义了15个 字符集:ios 8895-1、ios 8895-2…。
- iso 8895的15个字符集都是八位字符集,利用了ascii的最高位第八位,因此,都完全兼容ascii
- iso 8895可以理解为是为了一些特殊国家字符集而设立的,比如东欧是:iso 8895-1、中欧是iso 8895-2等。
- iso 8895-1, 也叫Latin-1,它是比较常见和重要的, 因为比ascii编码集更广,所以一些软件设置为默认字符集。
- iso 8895工作组已解散,目前全力维护iso 10646
- ISO-8859-1对应于ISO/IEC 10646即Unicode的前256个码位。
ascii和gb的关系
- 在ascii基础上,发展了用于处理简体的gb2312,处理繁体的big5
- gb2312字符集太少,后来发展为gbk(k是扩展的意思)
ANSI
UCS-2是什么
BOM和无BOM
unicode和utf的关系
utf8和16、32的关系
常用概念
- unicode:
- utf-8:1、2、3、4字节
- gbk、gb2312: 2字节
- gb18030: 1、2、4字节
gb2312编码
区位码是四位的十进制数字,是GB2312国标码中的分区表示方法,区位码的前两位数是“区号”,后两位数是“位号”。区号和位号分别加上160,再分别转换成十六进制数,就成为四位的十六进制GB2312国家标准编码(简称国标码)。
区位码把GB2312字符集分为94个区,每区含有94个位,共8836个码位,其中部分码位未安排字符
字符 | 区位号 | GB2312 | GBK | GB18030 | unicode | utf8 | utf16 | utf32 |
---|---|---|---|---|---|---|---|---|
啊 | 1601 | B0A1 | 0000554A | E5958A | FEFF554A | 0000FEFF0000554A |
- GB2312编码方案于1980年发布,收录汉字6763个,采用双字节编码。
- GBK编码方案于1995年发布,收录汉字21003个,采用双字节编码。
- GB18030编码方案于2000年发布第一版,收录汉字27533个;2005年发布第二版,收录汉字70000余个,以及多种少数民族文字。GB18030采用单字节、双字节、四字节分段编码。
平台 | 项目中使用的编码格式 |
---|---|
web前端 | utf-8 |
oracle | gb18030 |
mongo | utf-8 |
字符集 | 字符种类 | 字符数量 | 汉字所占长度 |
---|---|---|---|
gbk | 简体中文、繁体中文、日语韩语等 | ||
gb2312 | 简体中文 | 2字节 | |
gb18030 | 简体中文 | 1、2、4字节 | |
utf-8 | 2、3、4字节 |
概念:各种编码的区别
字符系列: 有详细代码,讲解比较详细
有hack方法,有对比,有详解
前端浏览器不支持gbk,因为用的少。
utf-8转GBK
1. form方法
代码实现
方法比较古老,使用form表单的chartset方法
缺点:
- 对ie需要适配
- 不支持gb18030
- 对于gbk,也需要服务器支持,不然报uri错误
- 额外的代码侵入
优点:
- 效率高
- 容易移植
总结:不推荐。
2.正则方法
缺点:
- 只能笼统的判断汉字,对于特殊汉字及字符需要额外判断。比较麻烦
优点:
- 代码最少
- 虽然麻烦,但是写好规则以后,移植也是最方便的
总结:不推荐
3.映射表方法
- 完成大部分功能,并且支持GB18030等偏僻的字符集
- 字符集与数据库字符集一致,不用对特殊字符和汉字额外判断
缺点:
- 覆盖了window的TextEncoder和TextDecoder函数
- 前端代码过大,即便压缩后,也有190KB的映射表代码。(上面git仓库里面的代码我去掉了多余部分,只要压缩就可得到190KB的代码)
总结:推荐
4.自己实现和mdn方法
5.nodejs
iconv-lite库