zoukankan      html  css  js  c++  java
  • 字符编码基础知识

    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个字符码空间。

    image_2d8a0259-48da-46a1-864c-b16301c745e5[4]

    其中第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记事本中编码的选择

    bg2007102801-thumb

    里面有四个选项: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-8http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

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

  • 相关阅读:
    jMeter 里 CSV Data Set Config Sharing Mode 的含义详解
    如何使用 jMeter Parallel Controller
    使用 Chrome 开发者工具 coverage 功能分析 web 应用的渲染阻止资源的执行分布情况
    使用 Chrome 开发者工具的 lighthouse 功能分析 web 应用的性能问题
    关于 SAP 电商云首页加载时触发的 OCC API 请求
    SAP UI5 确保控件 id 全局唯一的实现方法
    SAP 电商云 Accelerator 和 Spartacus UI 的工作机制差异
    介绍一个好用的能让网页变成黑色背景的护眼 Chrome 扩展应用
    Chrome 开发者工具 performance 标签页的用法
    Client Side Cache 和 Server Side Cache 的区别
  • 原文地址:https://www.cnblogs.com/xerrard/p/4239623.html
Copyright © 2011-2022 走看看