网上看到一篇关于字符集、字符编码的文章,说的幽美易懂适合小菜,贴出来以备查看。

字符集、字符编码

1、文件分为文本文件和二进制文件﹐不过本质都一样﹐都是些01。

2、计算机存储设备存储的0或1﹐称为计算机的一个二进制位(bit)。

3、二进制文件的0和1有专门的应用程序来读﹐所以它们没有什么乱不乱码的问题﹐只要该程序认得就行。(像doc,xls,exe,dll等)

4、文本文件就不一样了﹐notepad要认识它﹐vs.net要认识它,UE也要认识它…所以它们就要有一个标准。这个标准的原理其实很简单﹐就是把所有的字符都给它一个序号﹐然后根据这个序号来找字符就可以了。这个东东就是编码表,也叫字符集(charset)。

5、文本文件存的都是字符﹐如﹕A,?,@,x。很明显一个bit不能表示﹐刚好计算机的存储单位–字节(byte)就是多个字节(1个byte=8个bit),因此用byte来表示字符就理所当然了。

6、第一个编码表–ASCII码很快产生﹐很简单﹐就是用一个byte来表示一个字符(最高位置0),总共能存储128(2^8)个字符。如A用65表示﹐ 存在计算机中就是01000001(65)﹐为了书写方便﹐我们一般记作0×41(16进制),97则表示小写的a,存在计算机中就是01100001 (97)﹐记作0×61。?用63表示,记作0×3F。

7、英语国家的大小写字母加起来才52个字符﹐再加上数字﹐符号和一些特殊字符﹐已经足够使用。所以ASCII刚开始非常流行(谁叫计算机不是咱中国发明的… )

8、随着计算机的普及﹐当非英语系的国家开始使用时﹐ASCII已经明显不能满足了(总不成天天使用xiao sheng来表示”小生”吧),所以这些国家(地区)就开始制订自己的标准。

9、中国大陆制订了简体汉字的字符集(GB2312)。和英语国家不同﹐我们的汉字远远不止128个﹐所以一个byte肯定不能表示完﹐那就多加个byte, 16位(65536)总可以了吧。不过这样虽解决了位数不够的问题﹐但是原来的英文文件怎么办?总不成又全部拿出来改成双字节吧。幸好﹐居然发现原来的 ASCII的第一位居然是0﹐那我们把第1位改成1不就OK了吗?以后凡看到0开头的就读1个字节﹐1开头的就读2个字节。(而且128*128表示所有的简体字也足够了)

10、因此在GB2312标准中,”小”的序号是0xD0A1,表示成11010000 10100001,而A还是表示成01000001,这就是为什么简体操作系统读ASCII文件不会乱码﹐而反之则不然的原因。

11、目前来说﹐情况还比较好﹐中国大陆的计算机运行正常。

12、看到中国大陆制订了一个标准﹐其它国家和地区也不甘示弱﹐纷纷亮出自己的字符集,于是乎什么BIG5(中国台湾),shift_jis(日本),ks_c_5601-1987(韩国)都闪亮登场﹐一时间百鸟争鸣,百花齐放。

13、每个国家都想与ASCII保持兼容﹐理所当然﹐后面的字符就完全不一样了﹐因此﹐同样的0xD0A1,在GB2312中是”小”字﹐而在BIG5中却是”苤”字。你想想﹐这样不乱才怪。

14、到了这时候﹐总有人会想到﹐再这样继续下去是肯定不行的﹐于是它们就想到了﹐如果有一个标准﹐能包括所有字符那不就OK了吗?

15、于是”大哥大”标准就出来了﹐这就是unicode,为了能够足够表示世界上的所有字符这样光荣而又伟大的任务﹐这家伙用了四个字节来表示(2的32次方到底是多少﹐我也懒得算了),这下好了﹐天下太平了﹐再也不会有麻烦了﹐耳根清静了…(打住﹐你小子这么这么罗嗦呀)

16、不过 unicode好是好﹐但是毕竟四个字节表示一个字符”浪费”太大了(我那破猫上网容易吗﹐电信黑呀﹐说好是2M﹐就给我200K…)﹐而且大家”惊奇”地发现﹐居然世界上一些”较强大”的国家的字符刚好集中在前65536位前﹐呵呵﹐结果unicode也分成了unicode-16和unicode -32了﹐自然﹐前者只用两个字节表示(所以只能表示前65536位喽,欧亚国家大部分字符都OK了﹐什么﹐你们那个@$Y$%字符没有﹐呵呵﹐不管我什么事,找标准协会﹐都是那帮家伙弄的…)

17、虽然标准出来了﹐可是好歹ASCII也用了这么久﹐那些英语国家也在那里嚷嚷﹐这倒好 ﹐搞个什么破标准﹐我们又没有得到什么好处﹐反而让我们原来的程序都运行不了了(为什么呀﹐你想想﹐原来我们的程序字符都是一个字节一个字节认﹐现在倒好 ﹐全改成2个一起认﹐这还怎么跑呀?)﹐况且我们凭白无故了用了这么多0﹐真别扭(unicode中的前128位还是ASCII标准﹐只不过在前面加了8 个0)﹐由于那些国家”势力”比较大﹐所以这个问题不容忽视

18、这个世界上的牛人总是这么多﹐这个问题很容易就被小意思地解决了。

19、想想GB2312怎么解决与ASCII兼容的问题的(1开头的就读2个字节﹐0开头的就读1个字节)﹐同样﹐UTF也这样﹐0开头的读1个字节 (ASCII码)﹐110开头的读2个字节﹐1110开头的读3个字节﹐这就是伟大的UTF-8(当然还有UTF-16,原理一样﹐xx开头的读4个字节 ﹐xx开头的读5个字节﹐xx开头的读6个字节)

20、当然UTF-8没GB2312这么简单﹐读完之后不能直接查编码表﹐多加一个步骤﹐按照模板提取一下字符再查就OK了

以下就是UTF-8的模板

0×0000 - 0×007F用一个字节表示 0xxxxxxx

0×0080 - 0×07FF用两个字节表示 110xxxxx 10xxxxxx

0×0800 - 0xFFFF用三个字节表示 1110xxxx 10xxxxxx 10xxxxxx

举个例子吧,

如果你遇到了11100110 10110001 10001001 01000001 这样的字节流﹐首先你看第一个字节以1110开头﹐即读3个字节并按模板提取得到 0110 110001 001001(去除模板标志﹐再四字节四字节读即0×6c49),查unicode编码表就是”汉”字,而最后一个以0开头就一定是一个字节了﹐0×0041,也就是”A”。

21、 好了﹐上面是原理﹐再来谈谈简繁体操作系统转换时的乱码问题吧

22、 按照我的想法﹐windows操作系统应该有一个默认的系统字符集﹐如简体操作系统应该是GB码﹐繁体操作系统则是BIG5,英文操作系统是ASCII。系统内的软件(notepad)默认都是使用这个字符集。

23、 所以我在繁体操作系统默认存储的文本文件就是BIG5了﹐当这个文件到了简体系统里﹐它的notepad程序则使用自己的默认编码(GB)来读取﹐这样就乱了。

24、因此如果在保存时就使用utf-8来保存﹐应该在两系统切换时就不会有问题了。

25、而要解决这个问题其实也很简单﹐只要知道这个文本文件原来的编码就可以了﹐使用它读出来﹐再转成unicode即可。

上述的资料载自网上,不知出处。

 

转载于:https://www.cnblogs.com/freeton/archive/2013/03/08/2949784.html

[转] 字符集、字符编码相关推荐

  1. php的内部方法编码方式,字符集字符编码以及PHP中的一些转码方法

    在重写一些老的项目的时候,有可能会遇到这种情况 ¾ÍÒµÖ¸µ¼ÖÐÐÄ2010Ä꺮¼Ù·Å¼Ù֪ͨ �����˵�λ������� ???????? 这就是传说中的乱码,要想处理乱码,得先了 ...

  2. mms彩信发送 java_MMS彩信字符集(字符编码)

    标签: 彩信字符集在CharacterSets类中定义 android\frameworks\opt\telephony\src\java\com\google\android\mms\pdu\Cha ...

  3. 字符集 字符编码 utf-8签名 chcp

    字符集(character set)  字符的集合.字符集种类较多,每个字符集包含的字符个数不同.  常见字符集:ASCII字符集.GB2312字符集.BIG5字符集.GB18030字符集.Unico ...

  4. 字符集、字符编码、国际化、本地化简要总结(UNICODE/UTF/ASCII/GB2312/GBK/GB18030)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   普通的linux 和 普通的windows.    ...

  5. C++与字符集、字符编码

    目录 问题 字符集 字符编码 字符集与字符编码的关系 多种字符编码存在的意义 字符编码的发展历史 活动代码页 c++的多字节字符与宽字节字符 c++的多字节字符串与宽字节字符串 C++程序输出字符串的 ...

  6. 【字符集一】字符集vs字符编码

    [字符集一]字符集vs字符编码 一.字符集vs字符编码 1.字符集 2.字符编码 3.字符集vs字符编码 4.常见字符集 二.ASCII字符集 三.GBK字符集 1.GB2312 和 GBK字符集 2 ...

  7. python的字符编码叙述_Python: 熟悉又陌生的字符编码

    字符编码是计算机编程中不可回避的问题,不管你用 Python2 还是 Python3,亦或是 C++, Java 等,我都觉得非常有必要厘清计算机中的字符编码概念.本文主要分以下几个部分介绍: 基本概 ...

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

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

  9. 一文读懂字符编码(ASCII、ISO 8859、GB系列、Unicode)

    一文读懂字符编码(ASCII.ISO 8859.GB系列.Unicode) 一.字符编码相关组织 1.1 ANSI 美国国家标准学会 1.2 Ecma 国际 1.3 ISO/IEC 1.4 统一码联盟 ...

  10. c语言字符串用for语句去重,python简介、第一个python程序、变量、字符编码、用户交互程序、if...else、while、for...

    也愿大家永葆初心-- 已识乾坤大,犹怜草木青. 一.python简介 首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个MP3,编写一个文档等等,而计算 ...

最新文章

  1. 内核同步机制——互斥量
  2. SpringBoot 集成Mybatis
  3. 玄惭 mysql_阿里云数据库专家玄惭的“武功”全记录之最佳实践、双十一特别篇...
  4. Android --- 刚刚进入 Activity 页面的时候无法打开对话框,报错 Unable to add window -- token null is not valid; is your
  5. 高可用性、负载均衡的mysql集群解决方案
  6. 百度搜索引擎优化指南3.0_深圳网站搜索引擎排名优化电话,百度优化排名费用_华阳网络...
  7. 各型号交换机端口镜像配置方法和命令
  8. spring引入properties变量报错
  9. gulp教程、gulp-less安装
  10. dfuse Labs——展示 dfuse 的力量
  11. JVM语言Xtend优缺点速览
  12. sdiv和srem问题解决
  13. windows功能_Windows新功能全在这,新系统确实强大!
  14. (整理)手机上一些常用的url
  15. RHCE(四)SAMBA协议
  16. mysql 中的pri_关于MySQL中 主键 pri mul
  17. 什么是数据资产?数据资产管理应该如何落地?
  18. 网站风格变黑白的方法,用css或javascript方法将网站改为灰色
  19. linux下man手册汉化后,英文man手册被覆盖的解决办法
  20. 夯实JAVA基本之一 —— 泛型详解(1):基本使用

热门文章

  1. ubuntu系统写路由指令_ubuntu/linux下设置永久路由
  2. mysql存储过程执行两边_麻烦问下,为什么我的mysql存储过程一次调用,会被执行了两次?...
  3. vivo计算机的隐藏功能介绍,vivo手机有哪些隐藏功能?这6个功能实在太好用了,要悄悄用起来...
  4. mysql怎么加全局锁_MySQL锁机制/管理(并发锁,行锁,表锁,预加锁,全局锁等等)
  5. 一台计算机有64,在同一台计算机上使用带有32位和64位Altium设计软件的数据库元件库...
  6. 压缩比13为什么建议用92的油_92号和95号汽油有什么区别,可以混着用吗?
  7. [CQOI2011]动态逆序对
  8. Micropython实例之TPYBoardv102开发板DIY照相机
  9. MobileNets论文阅读笔记
  10. 为什么不需要对独立的jre进行环境变量配置