字符集与编码

来源:互联网 发布:淘宝网日本忍者服装 编辑:程序博客网 时间:2024/06/15 06:49
  • 列表内容

前言:

今天Notepad++查看测试传过来的一个log,打开后竟然有部分乱码, 无法查看完整信息,尝试更改编码后仍未能解决, 同事告知使用浏览器打开或许可以,于是捣鼓一下,使用浏览器打开并选择编码Unicode(UTF-8) 后终于正常显示,顺利解决问题。乱码显示的问题以前也经常遇到,从未认真对待过,刚好称此机会搞清楚。

  • “乱码”产生:

“编码”与“解码”不一致。
我们知道,计算机中存储的信息是用二进制数0、1表示的,而通过屏幕看到的英文、中文等字符是存储的二进制数转换之后的结果。也就是说:计算机依据什么规则存储字符,比如‘Z’ 用0、1如何表示存储,称之为“编码”,反过来,计算机中存储的二进制数如何依据什么规则解析显示出来,称之为“解码”。如果编码、解码的使用不匹配的规则,则可能导致’Z’ 显示为其它字符或者无法正确显示,产生乱码。

  • 字符(Character)与字符集(Charset):

字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等,
而字符集则是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、Unicode字符集等。

  • 字符编码(Character Encoding):

字符编码是一套法则,是将自然语言的字符集合与数字系统之间建立对应关系的一个规则,
每个字符需要一个编码来表示,然而每个字符究竟使用哪个编码代表,则要取决于何种编码规则,于是针对ASCII字符集、Unicode字符集等不同字符产生了不同编码规则。

  1. ASCII字符集与编码

ASCII字符集主要包括:可显示字符(英文大小写字符、阿拉伯数字和西文符号)和控制字符(回车键、退格、换行键等)。
ASCII字符集使用7位(bits)表示一个字符,共128字符,字符值从0到127,其中32到126是可打印字符,详细查看ASCII表。
ASCII扩展字符集:使用8位(bits)表示一个字符,共256字符,它是从ASCII字符集扩充出来的,扩充后的符号增加了表格符号、计算符号、希腊字母和特殊的拉丁符号。

  1. GB2312字符集与编码
    ASCII字符集和扩展集最多表示256个字符,并且显示字符为英文,随着计算机逐渐发展到中国,为了显示中文,必须设计一套编码规则用于将汉字转换为计算机可以接受的数字系统的规则,于是《中国国家标准简体中文字符集》产生了。汉字众多, 因此编码字符较多,详细可Google查看规则。

  2. Unicode 字符集与编码
    随着计算机和互联网发展,各地信息交流频繁,如果各地采用自己的编码方案,一旦通过网络传播,另一端由于不兼容,极大可能出现乱码现象,几乎不能正常交流。于是产生了统一编码Unicode的设想。
    Unicode编码系统为表达任意语言的任意字符而设计,使用4Byte的数字来表达每个字母、符号,或者表意文字,每个数字代表唯一的至少在某种语言中使用的符号。Unicode 基于通用字符集(Universal Character Set)的标准来发展,目前仍在不断扩增, 每个新版本插入更多新的字符。由于Unicode 复杂性,实际的编码方案中,存在UTF-32/ UTF-16/ UTF-8等编码规则。

    3.1 UTF-32
    上述介绍使用4Byte的数字来表达每个字母、符号,或者表意文字,每个数字代表唯一的至少在某种语言中使用的符号的编码方案,称为UTF-32。
    UTF-32(也称UCS-4)是一种将Unicode字符编码的协定,对每个字符都使用4字节。就空间而言,是非常没有效率的。
    这种方法有其优点,最重要的一点就是可以在常数时间内定位字符串里的第N个字符,因为第N个字符从第4×Nth个字节开始。虽然每一个码位使用固定长定的字节看似方便,它并不如其它Unicode编码使用得广泛。

3.2 UTF-8
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。因此,逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。

0 0