字符编码基础知识

1.字符集和字符编码的概念

字符集:一个字符对应着一个数值,这样的一个表就叫做字符集

字符编码:一个字符在内存中是怎样存储的,占用几个字节,每个字节中保存什么内容

2. ASCII码(英文基本编码)

一个字节(Byte)有8位二进制位(bit),每一个二进制位有0和1两种状态,因此每个字节就可以组合出256种状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。

ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

对英文字符和数字字符而言,ASCII码已经基本够用。

3、本地语言编码

对其他语言而言,128个符号是远远不够的。因此很多国家的语言都有自己的通用编码。

例如:

简体中文编码:GB2312,后来扩展为GBK。GB2312(GBK)的编码方案是使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。

繁体中文编码:BIG5。编码方案是双字节存储。

4.Unicode

Unicode是一个字符集,是为了解决传统的字符编码方案的局限而产生的,为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode字符集涵盖了目前人类使用的所有字符,并为每个字符进行统一编号,分配唯一的字符码,每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字"严"。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。Unicode字符集将所有字符按照使用上的频繁度划分为17个层面(Plane),每个层面上有216=65536个字符码空间。

其中第0个层面BMP(Basic Multilingual Plane基本多文种平面),基本涵盖了当今世界用到的所有字符。其他的层面要么是用来表示一些远古时期的文字,要么是留作扩展。我们平常用到的Unicode字符,一般都是位于BMP层面上的。目前Unicode字符集中尚有大量字符空间未使用。

Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。Unicode的编码方式有很多种,常见的如UTF-8 UCS-2 UTF-16

5.UCS-2

UCS-2是一种Unicode的编码方式:直接用两个字节存入字符的Unicode码。UCS-2最初设计的时候只考虑到BMP字符,因此使用固定2个字节长度,也就是说,他无法表示Unicode其他层面上的字符,

UCS-2编码分为Big endian和Little endian两种方式。

例如:中”的Unicode字符码是0x4E2D(01001110 00101101),那么我们可以编码为01001110 00101101(大端 Big endian,第一个字节4E,第二个字节2D)或者00101101 01001110 (小端 Little endian,第一个字节2D,第二个字节4E)。

6.UTF-16

UTF-16也是一种Unicode的编码方式,需要两个字节或者四个字节来存储字符。UTF-16可以看成是UCS-2的父集。在BMP字符(U+0000.. U+D7FF以及U+E000.. U+FFFF)内,和UCS-2完全一致。从U+D800到U+DFFF之间的区段永久保留不映射到字符, UTF-16利用这保留下来的0xD800-0xDFFF区段来对辅助平面(U+10000.. U+10FFFF)内的字符的Code Point进行编码。辅助平面(Supplementary Planes)中的字符,在UTF-16中被编码为一对16bit长的Code Unit(即32bit,4Bytes),称作代理对(surrogate pair)。具体代理对(surrogate pair)的设计请查验其他资料。

7.UTF-8

UTF-8是在互联网上使用最广的一种Unicode的编码方式。

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

UTF-8的编码规则有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的Unicode码。

下表总结了编码规则,字母x表示可用编码的位。

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

跟据上表,解读UTF-8编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

以汉字"徐"为例,演示如何实现UTF-8编码。

"徐"的Unicode是5F90(101111110010000),5F90处在上图第三行(0000 0800-0000 FFFF),因此"徐"的UTF-8编码需要三个字节,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,从"徐"的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。"徐"的UTF-8编码是"11100101 10111110 10010000",转换成十六进制就是E5,BE,90。

 

8.Windows记事本中编码的选择

 

里面有四个选项:ANSI,Unicode,Unicode big endian 和 UTF-8。

1)ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。

2)Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。这个选项用的little endian格式。

3)Unicode big endian编码。

4)UTF-8编码。

选择完"编码方式"后,点击"保存"按钮,文件的编码方式就立刻转换好了。

 

 

 

 

 

参考文章:

字符编码笔记:ASCII,Unicode和UTF-8 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

关于字符编码,你所需要知道的              http://www.cnblogs.com/KevinYang/archive/2010/06/18/1760597.html

时间: 2025-01-18 17:06:48

字符编码基础知识的相关文章

音视频编码基础知识

本文转载自 http://blog.csdn.net/ljzcom/article/details/7336258 ,如有需要,请移步查看. Technorati 标签: 音视频 编码 基础知识 --------------------------------分割线开始----------------------------------------------- 编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中

字符编码基础

ACSII 美国最初制定的字符编码,对英语字符和二进制之间的关系做了统一规定. 但ASCII码一共规定了128个字符的编码,用来表示其他语言是远远不够的,所以有了Unicode Unicode Unicode是一个符号集 javaScript允许直接使用码点表示Unicode字符,'好'==='\u597D' uneacape('\u597d') //好 javaScript使用UCS-2编码格式,属于Unicode的子集 Unicode范围一般所用为\u0000-\uffff,占用两字节大小,

java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**

在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基础知识 在了解各种字符集之前我们需要了解一些最基础的知识,如:编码.字符.字符集.字符编码基础知识. 编码 计算机中存储的信息都是用二进制表示的,我们在屏幕上所看到文字.图片等都是通过二进制转换的结果.编码是信息从一种形式或格式转换为另一种形式的过程,通俗点讲就是就是将我们看到的文字.图片等信息按照

Python2.7字符编码详解

一. 字符编码基础 为明确概念,将字符集的编码模型分为以下4个层次: 抽象字符清单(Abstract Character Repertoire, ACR):待编码文字和符号的无序集合,包括各国文字.标点.图形符号.数字等. 已编码字符集(Coded Character Set, CCS):从抽象字符清单到非负整数码点(code point)集合的映射. 字符编码格式(Character Encoding Form, CEF):从码点集合到指定宽度(如32比特整数)编码单元(code unit)的

开发技术--浅谈文件操作与字符编码

开发|浅谈文件操作与字符编码 听说Python的文件操作很容易在某一些电脑上出问题,然而罪魁祸首就是字符编码.让我们来了解一些底层的编码方式. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力求不含任何的自我感情色彩. 情感:用我自己的方式,解读知识点.力求通俗易懂,完美透析知识. 正文 本文主要分为两大部分,一部分是如何使用Python进行文件操作,另一部分是聊一下字符编码的那些事.(比较绕,尽量用最最最通俗的话表述~~) 文件操作 1.文件操作方式 open(

Python基础(字符编码与文件处理)

一.了解字符编码的知识储备 1.计算机基础知识(三副图) 2.文本编辑器存取文件的原理(notepad++,Pycharm,word) 打开编辑器就启动了一个进程,是在内存中运行的,所以在编辑器写的内容在没保存之前都是存放在内存中的,断电后数据就会丢失.因而需要保存到硬盘上,点击保存按钮,就从内存中把数据刷到硬盘上. 3.Python解释器执行py文件的与原理,例如python test.py 第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器. 第二阶段:python解释器相当

python第三天基础之字符编码

一 了解字符编码的知识储备 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的,断电后数据丢失 因而需要保存到硬盘上,点击保存按钮,就从内存中把数据刷到了硬盘上. 在这一点上,我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已. 2. python解释器执行py文件的原理 ,例如python test.py 第一阶段:python解释器启动,

day10 字符编码和文件处理

一.字符编码: 一 了解字符编码的知识储备   1. 计算机基础知识(三幅图)       2. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的,断电后数据丢失 因而需要保存到硬盘上,点击保存按钮,就从内存中把数据刷到了硬盘上. 在这一点上,我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已.  3. python解释器执行py文件的原理 ,例

字符编码转载和总结--待完善……

字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识. 字符编码概念(个人理解): 即字符与二进制位之间的关系.至于如何对应那就是看是什么样的字符编码方式! 编码方式介绍(摘抄,原地址不知道): 计算中提拱了多种编码方式,常见的有 ASCII.ISO-8859-1.GB2312.GBK.UTF-8.UTF-16 等.它们都可以被看作为字典,它们规定了转化的规则,按照这个规则就可以让计算机正确的表示我们的字符.目前的编码格式很多,例如 GB2312.GBK.UTF-8.UT