字符集和字符编码的关系,字符集是规范,字符编码是规范的具体实现;字符集规定了符号和二进制代码值的唯一对应关系,但是没有指定具体的存储方式;
unicode、ASCII、GB2312、GBK都是字符集;其中ASCII、GB2312、GBK既是字符集也是字符编码;注意不混淆这两者区别;而unicode的具体实现有UTF-8,UTF-16,UTF-32
最早出现的ASCII码是使用一个字节(8bit)来规定字符和二进制映射关系,标准ASCII编码规定了128个字符,在英文的世界,是够用的。但是中文,日文等其他文字符号怎么映射呢?因此其他更大的字符集出现了
unicode(统一字符集),早期时它使用2个byte表示1个字符,整个字符集可以容纳65536个字符。然而仍然不够用,于是扩展到4个byte表示一个字符,现支持范围是U+010000~U+10FFFF
unicode是两个字节的说法是错误的;UTF-8是变字长的,需要用14个字节存储;UTF-16一般是两个字节(U+0000U+FFFF范围),如果遇到两个字节存不下,则用4个字节;而UTF-32是固定四个字节
unicode表示的字符,会用“U+”开头,后面跟着十六进制的数字,如“字”的编码就是U+5B57
UTF-8 编码和unicode字符集
范围 Unicode(Binary) UTF-8编码(Binary) UTF-8编码byte长度 U+0000~U+007F 00000000 00000000 00000000 0XXXXXXX 0XXXXXX 1 U+0080~U+07FF 00000000 00000000 00000YYY YYXXXXXX 110YYYYY 10XXXXXX 2 U+0800~U+FFFF 00000000 00000000 ZZZZYYYY YYXXXXXX 1110ZZZZ 10YYYYYY 10XXXXXX 3 U+010000~U+10FFFF 00000000 000AAAZZ ZZZZYYYY YYXXXXXX 11110AAA 10ZZZZZZ 10YYYYYY 10XXXXXX 4

程序是分内码和外码,java的默认编码是UTF-8,其实指的是外码;内码倾向于使用定长码,和内存对齐一个原理,便于处理。外码倾向于使用变长码,变长码将常用字符编为短编码,罕见字符编为长编码,节省存储空间与传输带宽
JDK8的字符串,是使用char[]来存储字符的,char是两个字节大小,其中使用的是UTF-16编码(内码)。而unicode规定的中文字符在U+0000~U+FFFF内,因此使用char(UTF-16编码)存储中文是不会出现乱码的
JDK9后,字符串则使用byte[]数组来存储,因为有一些字符一个char已经存不了,如emoji表情字符,使用字节存储字符串更容易拓展
JDK9,如果字符串的内容都是ISO-8859-1/Latin-1字符(1个字符1字节),则使用ISO-8859-1/Latin-1编码存储字符串,否则使用UTF-16编码存储数组(2或4个字节)
System.out.println(Charset.defaultCharset()); //输出java默认编码
for (byte item : “程序”.getBytes(StandardCharsets.UTF_16)) {
System.out.print("[" + item + “]”);
}
System.out.println("");
for (byte item : “程序”.getBytes(StandardCharsets.UTF_8)) {
System.out.print("[" + item + “]”);
}
----result----
UTF-8 //java默认编码UTF-8
[-2][-1][122][11][94][-113] //UTF_16:6个字节?
[-25][-88][-117][-27][-70][-113] //UTF_8:6个字节 正常
“程序”的UTF-16编码竟是输出6个字节,多出了两个字节,这是什么情况?再试试一个字符的输出
for (byte item : “程”.getBytes(StandardCharsets.UTF_16)) {
System.out.print("[" + item + “]”);
}
—result–
[-2][-1][122][11]
可以看出UTF-16编码的字节是多了[-2][-1]两个字节,十六进制是0xFEFF。而它用来标识编码顺序是Big endian还是Little endian。以字符’中’为例,它的unicode十六进制是4E2D,存储时4E在前,2D在后,就是Big endian;2D在前,4E在后,就是Little endian。FEFF表示存储采用Big endian,FFFE表示使用Little endian
为什么UTF-8没有字节序的问题呢?个人看法,因为UTF-8是变长的,由第一个字节的头部的0、110、1110、11110判断是否需后续几个字节组成字符,使用Big endian易读取处理,反过来不好处理,因此强制用Big endian
其实感觉UTF-16可以强制规定用Big endian;但这其中历史问题。。。

字符集和字符编码的概念区分相关推荐

  1. 字符集和字符编码的类别与区分详解

    目录 1. 字符集和字符编码 编码和解码 字节和字符 字符集和字符编码 2. ASCII 3. GB2312.GBK.GB18030和Big5 GB2312 GBK GB18030 Big5 4. U ...

  2. 字符、字符集和字符编码详解(一文扫清疑惑)

    前言 字符.字符集和字符编码时常看见,之前也看过一些博文,看得迷迷糊糊地,看过即忘,今天有幸碰到一篇能让我醍醐灌顶的文章,整理一下相关知识点与大家分享! 原博文地址:字符集编码详解(学习,看一篇就够了 ...

  3. 字符集和字符编码(Charset Encoding)

    字符集和字符编码 一文参透字符编码的难题! 引子 在 python 中,处理字符串是常见任务,因为字符串编码问题,经常出现字符串乱码. 在 matplotlib 绘图时,text对象,如 axes_t ...

  4. 关于字符集和字符编码自己汇总记录

    第零篇 第一篇 第二篇 第三篇 第四篇:关于"unicode字符是2个字节"这句话的讨论 关于Unicode的中文百科  https://zh.wikipedia.org/wiki ...

  5. C--中文汉字占用字节长度(字符集和字符编码)

    中文汉字占用字节长度 一.字符集和字符编码 1.概念 2.英文字母和中文汉字在不同字符集编码下的字节数 二.环境对应的字符编码 1.Ubuntu16.04虚拟机 2.Notepad++ 三.sizeo ...

  6. 字符集和字符编码以及相关

    目录 为什么写本文? 什么是编码? 什么是字符? 字符集和字符编码的概念 简述字符集和字符编码发展史 Unicode字符集以及相关字符编码 参考链接 为什么写本文? 其实在我心中是一直知道有字符编码这 ...

  7. 谈谈字符集和字符编码

    http://tommwq.tech/blog/2020/11/20/232 1 字符集和字符编码 字符集(charset)和字符编码(character encoding)是两个含义相近的概念.在历 ...

  8. 字符集和字符编码(附c语言判断utf8编码)

    1.基础知识 1.1.字符集 字符(Character)是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.  字符集(Character set)是多个字符的集合,字符集种类较多,每 ...

  9. 13、字符集和字符编码

    字符集:字符集是多个字符的集合,常见字符集有:ASCII字符集.GB2312字符集.GB18030字符集.Unicode字符集等. ASCII字符集:是英文大小写字符.阿拉伯数字和西文符号的一个集合. ...

最新文章

  1. JUnit4测试框架设计与实现
  2. 数据分析Python:sklearn数据预处理中fit(),transform()与fit_transform()的区别
  3. mysql基础查询语法
  4. 华为电视鸿蒙系统好用吗,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  5. 分布式任务调度平台XXL-JOB搭建使用
  6. 读书笔记:深度学习中的正则化
  7. mysql limit (1-1)10_110,当您知道只有1个结果时,是否将'LIMIT 1'添加到MySQL查询中使它们更快?...
  8. 2013.07.10《播音主持之绕口令训练…
  9. LibSVM制作鸢尾花数据集
  10. 【年终总结系列 2017】求职之路
  11. 态势感知——活跃IP段探测脚本集合【多语言】
  12. 中国城市云计算首站现场会成都隆重举行
  13. css文字闪光特效,利用js css3实现文字闪光滑过动画特效
  14. kali安装小企鹅输入法
  15. hexo的yilia主题之添加Valine评论系统
  16. Win7从文件服务器复制文件速度慢问题处理
  17. SOA+LDAP实现SSO单点登录思路
  18. Redis启动和连接
  19. 服务器安装360文档卫士,360文档卫士
  20. 【51单片机】Proteus C51 例题

热门文章

  1. iOS开发--TableView详细解释
  2. Sql Group by 使用
  3. java笔记之WebProject常见问题
  4. JavaScript 解决浮点值运算Bug
  5. python 在列表中完成队列的删除和排序
  6. 编译php的时候,报configure: error: mcrypt.h not found. Please reinstall libmcrypt.错误的解决办法...
  7. 出产报表数据库呈现了运动事项的回滚段毁坏(二)
  8. Windows 下安装mysql
  9. python2默认编码_解决Python2.x编码之殇
  10. P1080 国王游戏(贪心+高精度乘除及大数比较)