关于字符及编码

首先,我们要知道一些概念和标准。
    字符和字节是两个容易混淆的概念,下面我们来看一下它们的含义。
•    字符:人们用来表示某种意义的符号,如“1”、“a”、“字”等。
•    字节:字节是存储空间的基本计量单位,由8个二进制位构成。
•    字符串:零个或多个字符组成的有限序列。
•    字符集:字符的集合,由于历史原因形成了多种标准,主要包括以下几种:
  ASCII字符集
  ANSI字符集
  Unicode字符集
    这些字符集包含什么又有什么关系呢?
    这个问题的答案就是计算机字符集的发展历史。
    ASCII(美国信息交换标准委员会American Standards Committee for Information Interchange)字符集,是计算机产生之初为英文通信设计的7位字符集。包含了基本的英文字母、数字、标点符号等128个字符。
    随着计算机的广泛应用,为了可以在计算机中保存更多的信息,增加了新的字母、符号,还加入了很多画表格时需要用到的横线、竖线、交叉等形状。这些新增的字符从用128到255之间的数字进行表示,它们构成的字符集通常被称为“扩展字符集”。
    计算机进入中国后为了表示汉字(仅常用汉字就有6000多个),我们规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(称为高字节)从0xA1用到0xF7,后面一个字节(称为低字节)从0xA1到0xFE,这样就可以组合出7445个简体汉字。在这些编码里,还把数学符号、罗马希腊的字母、日文的假名都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编成了两个字节长的编码,这就是常说的“全角”字符,而原来在127号以下的那些就叫“半角”字符了。这种汉字方案叫做“GB2312”,是对ASCII的中文扩展。
    由于汉字太多,我们不得不再一次增加字符的使用范围,只要第一个字节大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。扩展之后的编码方案被称为GBK标准,GBK包括了GB2312的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。后来我们再扩展,又加了几千个新的少数民族的字,GBK扩成了GB18030。
    程序员们将其通称为“DBCS”(双字节字符集Double Byte Charecter Set),最大的特点是两字节长的汉字字符和一字节长的英文字符并存,因此中文处理时必须要注意字串里每一个字节的值,如果这个值是大于127的,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。
与此同时各个国家和地区所制定的不同ANSI编码标准中,都只规定了各自语言所需的“字符”。这些ANSI编码标准所规定的内容包含两层含义:
  标准中包含哪些文字和符号,而这些“字符”的集合称为“字符集”。
  规定每个“字符”分别用几个字节存储。用什么值来表示这些字符,这个规定就叫做“编码”。
    因为当时各个国家都搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连中国大陆和中国台湾使用着同一种语言的地区,也分别采用了不同的DBCS编码方案——GB2313(中国大陆)和BIG5(中国台湾)编码,装错了字符系统,显示就会乱了套。
    这时,ISO的国际组织决定着手解决这个问题。他们重新搞了一个包括地球上所有文字和符号的编码——“Universal Multiple-Octet Coded Character Set”,简称UCS,就是我们现在常说的“Unicode”。
Unicode在制定时没有考虑与任何一种现有的编码方案保持兼容,这使得GBK与Unicode在汉字的内码编排上是完全不一样的,没有一种简单的算法可以使文本内容在Unicode编码和ANSI编码间进行转换,这种转换必须通过查表来进行。
    Unicode开始制定时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是ISO就直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些字符,Unicode保持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他语言的文字和符号则全部重新统一编码。由于英文符号只需要用到低8位,所以其高8位永远是0,因此这种方案在保存英文文本时会浪费一倍的空间。
    从Unicode开始,无论是半角的英文字母,还是全角的汉字,都是统一的“一个字符”。同时,也都是统一的“两个字节”(这里要注意“字符”和“字节”两个概念的不同,“字节”是物理存储的基本计量单位,而“字符”则是一个文化相关的符号)。在Unicode中,一个字符就是两个字节。
    多种字符集存在时,那些生产多语言软件的公司为了在不同的国家销售同一套软件,就不得不在区域化软件时注意双字节字符集,不仅要处处小心不要搞错,还要把软件中的文字在不同的字符集中转来转去。Unicode对于他们来说是一个很好的一揽子解决方案,于是从Windows NT开始,微软把它们的操作系统改了一遍,把所有的核心代码都改成了用Unicode方式工作的版本,从这时开始,Windows系统终于无须加装各种本土语言系统,就可以显示全世界上所有文化的字符了。
    如前所述,Unicode是用两个字节来表示一个字符,总共可以组合出65535个不同的字符,这大概已经可以覆盖世界上所有文化的符号。如果还不够也没有关系,ISO已经准备了UCS-4方案,就是四个字节来表示一个字符,这样就可以组合出21亿个不同的字符(最高位规定为0)。
    为了解决Unicode的传输问题,产生了面向传输的UTF(通用字集转换格式——Universal Character Set Transformation Format)标准,顾名思义,UTF-8就是以8位为单元对UCS进行编码,UTF-16以16位为单元对UCS进行编码,Unicode与UTF之间可以通过一些算法和规则来相互转换。

文件管理器之字符和编码相关推荐

  1. 创建数据库,指定数据库的字符集和编码顺序

    创建数据库,指定它的字符集和编码顺序 create database {数据库名称} CHARACTER SET {字符集} COLLATE {排序规则} 举例: create database co ...

  2. char,Character,int,字符及编码日记

    char,Character,int,字符及编码日记 public class Test {public static void main(String[] args) {char c = 'a';C ...

  3. unicode字符显示方框_【硬核】韦东山:字符的编码方式

    自从上次发布"Framebuffer应用编程"视频后, 我们花了10多天调试STM32MP157板子,4.19内核.5.4内核全部调试通过! 在调试过程中,编写了不少文档,到时整理 ...

  4. char,Character,int,字符及编码日记 1

    char,Character,int,字符及编码日记 public class Test {public static void main(String[] args) {char c = 'a';C ...

  5. J2EE 字符 字节 编码知识概念

    java中的字符,字节和编码 分类: Java2008-01-02 11:501053人阅读评论(0)收藏举报 javastring语言windows数据库服务器存储 目录(?)[+] 编码问题的由来 ...

  6. [转]各种字符集和编码详解

    在软件的编码和实现中,我们可能会碰到个 一个比较头疼的问题--编码,不同字符间的编码和解码,你确定了解各种字符的编码吗?一个朋友问到了我这个问题,我虽然能回答一两个出来,但是感觉已经有点模糊,混乱了, ...

  7. Ruby:字符集和编码学习总结

    背景 Ruby直到1.9版本才很好的支持了多字节编码,本文简单总结了今天学习的关于Ruby编码方面的知识. 字符串可以使用不同的编码 在.NET中字符串的编码是一致的,Ruby允许字符串有不同的编码, ...

  8. 面试题字符集和编码区别_您和理想工作之间的一件事-编码面试!

    面试题字符集和编码区别 A recruiter calls you for a position with your dream company. You get extremely excited ...

  9. 29 Python - 字符与编码

    字符与编码 01 字符串本质 Python字符串相关概念 字符串     str 字节       bytes 字节数组   bytearray 电脑字符串存储机制 字符库:A.B每个字符有一个代码点 ...

  10. 你不知道的 字符集和编码(编码字符集与字符集编码)

    我的上篇文章,有朋友提出字符集和编码的区别,我在此立文和大家讨论下 常说的字符集和编码区别,其实就是编码字符集和字符集编码的区别,其实,单单如果只是说字符集,没有任何编码的概念的话,那么字符集其实仅仅 ...

最新文章

  1. mysql的repeat()函数
  2. java 文件 剪切_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇
  3. 问题 F: 积木大赛(模拟)
  4. go语言中go+select的理解
  5. 一个“老”程序员的思考
  6. tecplot批量导出图片_批量导出Excel图片,用这招,半分钟干的活别人一整天完不成...
  7. 算法学习 -- 枚举
  8. Python绘制渐变色三角形
  9. 如何判断过拟合和欠拟合
  10. licode学习之编译篇--3
  11. Django笔记8(模板引擎)
  12. 安卓app开发工具_手机APP开发会涉及到哪些知识点呢?
  13. ES系列三、基本知识准备
  14. 增值税税控设备(计算机打印机)全额抵扣,在航天金穗购买的打印机、扫描仪是否属于防伪税控设备...
  15. FlashFXP 5.4.0 注册
  16. layui可以动态添加div吗_js 动态添加元素(div、li、img等)及设置属性的方法
  17. 下面哪些不是java的原始数据类型_以下哪个不是Java的原始数据类型()A? – 手机爱问...
  18. AMap(高德官方图层)
  19. 计算机学院运动会通讯稿,大学运动会通讯稿300字汇总七篇
  20. 用好这28个工具,开发效率爆涨

热门文章

  1. 冲刺七天----03
  2. Linux下批量修改文件名方法
  3. Linux_Shell符号及各种解释对照表
  4. 彻底搞定char/wchar_t/unicode
  5. 关于中断和异常的几点认识
  6. 关于SqlDataReader类型的变量传值问题
  7. react页面内嵌微信二维码 和 自定义样式 以及 微信网页共用unionId问题
  8. jquery 使用下拉效果的实现
  9. 如何在Windows 10中启用关闭事件跟踪程序
  10. 解决安卓手机上软键盘弹出挤压背景的问题