字符编码常识

1. 什么是字符编码

  字符编码是指一套将真实世界里的字母/字符与计算机的二进制序列进行相互转化的规则。

2. 拉丁字符

  • 基础拉丁字符:
    二十六个字母、数字和常用的标点符号。
  • 派生拉丁字符:
    如希腊字母等
  • 完整意义的拉丁字符:
    前两者结合

3. ASCII

  ASCII的全称是American Standard Code for Information Interchange(美国信息交换标准代码)。
  ASCII编码也只支持基础拉丁字符。ASCII的设计也很简单,用一个字节(8个位)来表示一个字符,并保证最高位的取值永远为'0'。即表示字符含义的位数为7位,不难算出其可表达字符数为27 =128个。这128个字符包括95个可打印的字符(涵盖了26个英文字母的大小写以及英文标点符号能)与33个控制字符(不可打印字符)。
  由于存在大量派生拉丁字符,因此有许多其他编码规则。如欧洲的ASCII等。

4.中文编码

  常见的中文编码有GB2312(与UTF-8不兼容),该编码用两个字节表示中文,对于基本拉丁字符使用一个字节,兼容ASCII。

5.Unicode

  Unicode是将全世界字符都统一的字符编码规则。采用四个字节表示一个字符,能够表示将近21亿左右的字符数量。
  Unicode编码下有许多问题,如对于基本拉丁字母和汉字来说十分浪费,因为前三个或两个字符均是0。而Unicode码的一些实现方式能够解决部分问题,如UTF-8。UTF-8是Unicode的一种实现方式,而Unicode是一个统一标准规范,Unicode的实现方式除了UTF-8还有其它的,比如UTF-16等。
  下面简单介绍一下UTF-8的编码规则:

  • 规则1:对于单字节字符,字节的第一位为0,后7位为这个符号的Unicode码,所以对于拉丁字母,UTF-8与ASCII码是一致的。
  • 规则2:对于n字节(n>1)的字符,第一个字节前n位都设为1,第n+1位为0,后面字节的前两位一律设为10,剩下没有提及的位,全部为这个符号的Unicode编码。


    通过,根据以上规则,可以建立一个Unicode取值范围与UTF-8字节序表示的对应关系,如下表
    字符编码常识_第1张图片
    unicode_utf8.png

  举例来说,’微’的Unicode是’\u5fae’,二进制表示是”00000000 00000000 01011111 10101110“,其取值就位于’0000 0800-0000 FFFF’之间,所以其UTF-8编码为’11100101 10111110 10101110’ (加粗部分为固定编码内容)。

6. ANSI编码

  ANSI是Windows的默认编码方式,针对英文使用ASCII,针对中文使用GB2312。

7.UTF-8的BOM

  BOM的全称是Byte Order Mark,BOM是微软给UTF-8编码加上的,用于标识文件使用的是UTF-8编码,即在UTF-8编码的文件起始位置,加入三个字节"EE BB BF"。这是微软特有的,标准并不推荐包含BOM的方式。采用加BOM的UTF-8编码文件,对于一些只支持标准UTF-8编码的环境,可能导致问题。

8. 为什么数据库Latin1字符集(单字节)能存储中文?

  其实不管需要使用几个字节来表示一个字符,但最小的存储单位都是字节,所以,只要能保证传输和存储的字节顺序不会乱即可。作为数据库,只是作为存储的使用的话,只要能保证存储的顺序与写入的顺序一致,然后再按相同的字节顺序读出即可,翻译成语义字符的任务交给应用程序。比如’微’的UTF-8编码是'0xE5 0xBE 0xAE',那数据库也存储'0xE5 0xBE 0xAE'三个字节,其它应用按顺序从数据库读取,再按UTF-8编码进行展现。这当然是一个看似完美的方案,但是只要写入,存储,读取过程中岔出任何别的编码,都可能导致乱码。

你可能感兴趣的:(字符编码常识)