zoukankan      html  css  js  c++  java
  • 字符常见的几种编码方式

    不管在是在编辑文本文件的时候,还是在制作网页的时候,总会遇到文本编码方式的问题。假设处理不当,就会出现乱码的问题。因此,有必要对文本的编码方式做一个详尽的了解。

    常见的一些字符编码方式无非有:Unicode、ASCII、GBK、GB2312、UTF-8。以下先对常见的这一些字符编码方式作下说明:

    1.ASCII码

    这是美国在19世纪60年代的时候为了建立英文字符和二进制的关系时制定的编码规范,它能表示128个字符,当中包含英文字符、阿拉伯数字、西文字符以及32个控制字符。它用一个字节来表示详细的字符,但它仅仅用后7位来表示字符(2^7=128),最前面的一位统一规定为0。

    2.扩展的ASCII码

    原本的ASCII码对于英文语言的国家是够用了,可是欧洲国家的一些语言会有拼音,这时7个字节就不够用了。因此一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比方,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使 用的编码体系,能够表示最多256个符号。但这时问题也出现了:不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比方,130在法语编码 中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表还有一个符号。可是无论如何,全部这些编码方式中,0—127表示的符号是一样的,不一样的仅仅是128—255的这一段。这个问题就直接促使了Unicode编码的产生。

    3.Unicode符号集

    正如上一节所说,世界上存在着多种编码方式,同一个二进制数字能够被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件经常出现乱码?就是由于发信人和收信人使用的编码方式不一样。而Unicode就是这样一种编码:它包括了世界上全部的符号,而且每个符号都是独一无二的。比方,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。详细的符号相应表,能够查询unicode.org,或者专门的汉字相应表 。非常多人都说Unicode编码,但事实上Unicode是一个符号集(世界上全部符号的符号集),而不是一种新的编码方式。

    可是正由于Unicode包括了全部的字符,而有些国家的字符用一个字节便能够表示,而有些国家的字符要用多个字节才干表示出来。即产生了两个问题:第一,假设有两个字节的数据,那计算机怎么知道这两个字节是表示一个汉字呢?还是表示两个英文字母呢?第二,由于不同字符须要的存储长度不一样,那么假设Unicode规定用2个字节存储字符,那么英文字符存储时前面1个字节都是0,这就大大浪费了存储空间。

    上面两个问题造成的结果是:1)出现了unicode的多种存储方式,也就是说有很多种不同的二进制格式,能够用来表示unicode。2)unicode在非常长一段时间内无法推广,直到互联网的出现。

    4.UTF-8

    互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其它实现方式还包含UTF-16和UTF-32,只是在互联网上基本不用。反复一遍,这里的关系是,UTF-8是Unicode的实现方式之中的一个。

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

    UTF-8的编码规则非常easy,仅仅有两条:

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

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

    5.GBK/GB2312/GB18030

    GBK和GB2312都是针对简体字的编码,仅仅是GB2312仅仅支持六千多个汉字的编码,而GBK支持1万多个汉字编码。而GB18030是用于繁体字的编码。汉字存储时都使用两个字节来储存。


    总的来说:

    ASCII编码:用来表示英文,它使用1个字节表示,当中第一位规定为0,其它7位存储数据,一共能够表示128个字符。

    拓展ASCII编码:用于表示很多其它的欧洲文字,用8个位存储数据,一共能够表示256个字符

    GBK/GB2312/GB18030:表示汉字。GBK/GB2312表示中文简体,GB18030表示繁体中文。

    Unicode编码:包括世界上全部的字符,是一个字符集。

    UTF-8:是Unicode字符的实现方式之中的一个,它使用1-4个字符表示一个符号,依据不同的符号而变化字节长度。


    *假设你想了解很多其它关于编码的信息,推荐阅读:字符编码方式 (空暇时请再继续研读一下这篇文章)

    *相关阅读:判定文件编码或文本流编码的方式(Java实现)


  • 相关阅读:
    linux_一些shell命令分析记录
    linux shell if
    linux_磁盘挂载
    远程工具记录
    oracle_多字段统计(多count)
    tomcat_日志打印格式问题
    cgo -rpath指定动态库路径
    Ubuntu下两个gcc版本切换
    [转]Go与C语言的互操作
    [转]【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4552734.html
Copyright © 2011-2022 走看看