β

字符编码

Novtopro Tracker 125 阅读

字节与字符

字符编码

字节是一个八位的存储单元,取值范围一定是0~255。而字符为语言意义上的符号,如"a"、"b"、"你"等。

ASCII码

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这套字符编码被称为ASCII码,ASCII码使用一个字节(8位)来映射表示一个英语字符,它一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

ISO-8859-1

国际标准化组织通过了一套ISO-8859-1的编码,规定了单字节256个符号的编码方式。目前,这是8位编码的国际标准。

ASCII码是不能通用的

对于英语字符,那么ASCII码完全够用,但是对于其他语言的字符(如汉字),ASCII码是无法完全表示的。此时就必须使用多个字节表达一个字符,如简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个字符。

乱码与Unicode

由于编码方式的不同,如ASCII码使用一个字节表示一个字符,而GB2312使用两个字节表示一个字符,所以对于计算机内部同一个二进制数字使用不同的编码方式可以解释成不同的字符,如果使用了错误的编码方式,就会出现乱码。

如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。

需要注意的是,Unicode只是一个字符集,它只规定了字符的二进制代码,却没有规定这个二进制代码应该如何存储。如:

# 汉字"非"的十六进制和二进制数
"非".ord.to_s(16).upcase  #  => "975E"
"非".ord.to_s(2)          #  => "1001011101011110"
# Emoji字符"



作者:Novtopro Tracker
When the problem is complexity, the cure might just be simplicity.
原文地址:字符编码, 感谢原作者分享。