每一个软件开发者都必须了解的关于Unicode和字符集的基本知识【笔记】

原文章链接:

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) – Joel on Software

一、历史视角

理解这些东西的最好方法是按照时间顺序来

回到semi-olden days,当Unix被发明,K&R正在编写C语言时。ASCII码出现,它可以使用32到127的数字表示每个字符。空格是32,字符“A”是65等等。这可以很方便的存储在7位。

ASCII 表

 那个年代的大多数计算机都使用 8 位字节,因此不仅可以存储所有可能的 ASCII 字符,而且还有一整块空闲空间。

而因为字节最多可容纳 8 位,所以很多人开始思考,“天哪,我们可以将 128-255 代码用于我们自己的目的。”例如,在某些 PC 上,字符代码 130 将显示为 é,但在以色列销售的计算机上,它是希伯来字母:

ג

最后,在 ANSI 标准中,每个人都同意在 128 以下做什么,这与 ASCII 几乎相同,但是有很多不同的方法来处理 128 及以上的字符,这取决于你住在哪里。这些不同的系统被称为代码页

但是,大多数人只是假装一个字节是一个字符,一个字符是 8 位,只要你从来没有将字符串从一台计算机移动到另一台计算机,或者说不止一种语言,它总是可以工作的。但是,当然,一旦互联网出现,将字符串从一台计算机移动到另一台计算机就变得司空见惯,整个混乱就崩溃了。幸运的是,Unicode 已经被发明了。

二、Unicode

它创建了一个单一的字符集,其中包括地球上所有合理的书写系统以及一些像克林贡语这样的虚构系统。

我们需要理解它的思维方式。我们假设一个字母可以映射到可以存储在磁盘或内存中的位:

A -> 0100 0001

在 Unicode 中,一个字母映射到一个称为代码点(code point)的东西,这仍然只是一个理论概念。该代码点如何在内存或磁盘中表示是一个完整的故事。

每个字母表中的每个柏拉图式字母(platonic letter)都被 Unicode 联盟分配了一个神奇的数字,它的写法如下:U+0639

U+意味着Unicode,数字是十六进制的。这个代表着阿拉伯字母 Ain。

Unicode 可以定义的字母数量没有真正的限制,事实上它们已经超过了 65,536。假设我们有一串字符:

Hello

在Unicode中对应于5个代码点:U + 0048 U + 0065 U + 006C U + 006C U + 006F

但是这只是一堆数字,代码点,还没有说明如何将其存储在内存中或在电子邮件中表示它。

三、Encodings

The earliest idea for Unicode encoding, which led to the myth about the two bytes,所以Hello变成了:

00 48 00 65 00 6C 00 6C 00 6F

Well, technically, yes, I do believe it could, and, in fact, early implementors wanted to be able to store their Unicode code points in high-endian or low-endian mode, whichever their particular CPU was fastest at, and lo, it was evening and it was morning and there were already two ways to store Unicode.

所以人们被迫想出了在每个 Unicode 字符串的开头存储一个 FE FF 的奇怪约定;这称为Unicode 字节顺序标记,如果要交换高字节和低字节,它将看起来像 FF FE,读取字符串的人将知道他们必须每隔一个字节交换一次。

之后发明了UTF-8的概念。UTF-8 是另一种使用 8 位字节在内存中存储 Unicode 代码点字符串(那些神奇的 U+ 数字)的系统。。在 UTF-8 中,从 0 到 127 的每个代码点都存储在一个字节中。只有128及以上的码位使用2、3存储,实际上最多6个字节。

UTF-8 的工作原理

 当然UTF-8也有缺点,即英语文本在 UTF-8 中看起来与在 ASCII 中完全相同,因此美国人甚至不会注意到任何错误。

到目前为止,已经告诉了三种编码 Unicode 的方法。传统的store-it-in-two-byte方法被称为UCS-2(因为它有两个字节)或UTF-16(因为它有16位),你还是要弄清楚它是不是高端UCS- 2 或低端 UCS-2。还有流行的新 UTF-8标准。当然还有其他的方式。

四、关于编码的一个最重要的事实

在不知道字符串使用什么编码的情况下拥有字符串是没有意义的

如果在内存中、文件中或电子邮件中有一个字符串,你必须知道它的编码方式,否则你无法正确解释它或向用户显示它。

我们如何保留有关字符串使用的编码的信息?嗯,有标准的方法可以做到这一点。对于电子邮件,应该在表单的标题中有一个字符串

内容类型:文本/纯文本;字符集=“UTF-8”

对于网页,最初的想法是 Web 服务器将与网页本身一起返回一个类似的Content-Type http 标头——不是在 HTML 本身中,而是作为在 HTML 页面之前发送的响应标头之一。但这会导致问题。

如果你可以使用某种特殊标签将 HTML 文件的 Content-Type 放在 HTML 文件本身中,那将会很方便。

<html>
<head>

< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" >

如果 Web 浏览器在 http 标头或元标记中找不到任何 Content-Type,他们会怎么做?Internet Explorer 实际上做了一些非常有趣的事情:它试图根据各种字节在各种语言的典型编码中的典型文本中出现的频率来猜测使用了什么语言和编码。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值