16.1 字符集与 HTTP

  • 每天有上亿的人用数百种语言写着各种文档。为了真正实现万维网的目标,HTTP 要能够传输和处理用多种语言和字母表编写的国际性文档。
  • 本章涵盖网站国际化方面的两个主要问题:字符集编码(character set encoding)和语言标记(language tag)。
  • HTTP 应用程序使用字符集编码请求和显示不同字母表中的文本,它们使用语言标记根据用户所理解的语言来说明并限制内容。
  • HTTP 报文中可以承载以任何语言表示的内容,就像它能承载图像、影片,或任何类型的媒体那样。对 HTTP 来说,实体主体只是二进制信息的容器而已。为了支持国际性的内容,服务器需要告知客户端每个文档的字母表和语言,这样客户端才能正确地把文档中的信息解包为字符并把内容呈现给用户。
  • 服务器通过 HTTP 协议的 Content-Type 首部中的 charset 参数和 Content-Language 首部告知客户端文档的字母表和语言。这些首部描述了实体主体的“信息盒子”里面装的是什么,如何把内容转换成合适的字符以便显示在屏幕上以及里面的词语表示的是哪种语言。
  • 同时,客户端需要告知服务器用户理解何种语言,浏览器上安装了何种字母表编码算法。客户端发送 Accept-Charset 首部和 Accept-Language 首部,告知服务器它理解哪些字符集编码算法和语言以及其中的优先顺序。比如:
    Accept-Language: fr, en;q=0.8
    Accept-Charset: iso-8859-1, utf-8
    例子中使用法语和英语,q 为质量因子(quality factor),说明英语的优先级(0.8)比法语低 (默认值是 1.0)。浏览器支持 iso-8859-1 西欧字符集编码和 UTF-8 Unicode 字符集编码。

1. 字符集是把二进制码转换为字符的编码

  • HTTP 字符集的值说明如何把实体内容的二进制码转换为特定字母表中的字符。每个字符集标记都命名了一种把二进制码转换为字符的算法(反之亦然)。
  • 字符集标记在由 IANA 维护(参见 http://www.iana.org/assignments/character-sets)的 MIME 字符集注册机构进行了标准化。
  • 比如:下面的 Content-Type 首部告知接收者,传输的内容是一份 HTML 文件,用 charset 参数告知接收者使用 iso-8859-6 阿拉伯字符集的解码算法把内容中的二进制码转换为字符:
    Content-Type: text/html; charset=iso-8859-6
    iso-8859-6 的编码算法把 8 位值域映射为拉丁字母和阿拉伯字母,以及数字,标点和其他符号。下图中,突出显示的二进制码的值是 225,它在 iso-8859-6 中被映射到阿拉伯字母“FEH”(读音类似英语字母 F)。
    这里写图片描述
  • 有些字符编码(比如 UTF-8 和 iso-2022-jp)更加复杂,它们是可变长(variable-length)编码,也就是说每个字符的位数都是可变的。这种类型的编码允许使用额外的二进制位表示拥有大量字符的字母表(比如汉语和日语),仅用较少的二进制位来表示标准的拉丁字符。

2. 字符集和编码工作机制

  • 我们想把文档中的二进制码转换为字符以便显示在屏幕上。但由于有很多不同的字母表,也有很多不同的方法把字符编码成二进制码(这些方法各有优缺点),我们需要一种标准方法来描述并应用把二进制码转换为字符的解码算法。
  • 把二进制码转换为字符要经过两个步骤:
    • a 中,文档中的二进制码被转换成字符代码,它表示了特定编码字符集中某个特定编号的字符。在这个例子里,解码后的字符代码是数字编号 225。
    • b 中,字符代码用于从编码的字符集中选择特定的元素。在 iso-8859-6 中,值 225 对应阿拉伯字母“FEH”。在步骤 a 和 b 中使用的算法取决于 MIME 的 charset 标记。
      这里写图片描述
  • 国际化字符系统的关键目标是把语义(字母)和表示(图形化的显示形式)隔离开来。HTTP 只关心字符数据和相关语言及字符集标签的传输。字符形状的显示 是由用户的图形显示软件(包括浏览器、操作系统、字体等)完成的,如图中 c 所示。

3. 同一个字符代码,不同的字符集显示不同字符

  • 如果客户端使用了错误的字符集参数,客户端就会显示一些奇怪的错乱字符。假设浏览器从主体中获得值 225(二进制为 11100001)。
    • 如果浏览器认为主体是用 iso-8859-1 西欧字符编码的,它将会显示带有重音符号的小写拉丁字母“a”: á 。
    • 如果浏览器使用 iso-8859-6 阿拉伯编码,它将会显示阿拉伯字母“FEH”:ف 。
    • 如果浏览器使用 iso-8859-7 希腊编码,它将会显示小写的希腊字母“Alpha”: α 。
    • 如果浏览器使用 iso-8859-8 希伯来编码,它将会显示希伯来字母“BET”: ב 。

4. 标准化的MIME charset值

  • 特定的字符编码方案和特定的已编码字符集组合成一个 MIME 字符集(MIME charset)。HTTP 在 Content-Type 和 Accept-Charset 首部中使用标准化的 MIME charset 标记。MIME charset 的值都会在 IANA 注册。
  • 下表列出了文档和浏览器所使用的部分 MIME charset 编码方案:
    这里写图片描述

5. 关于字符集的首部

  • Web 服务器通过在 Content-Type 首部中使用 charset 参数把 MIME 字符集标记发送给客户端:
    Content-Type: text/html; charset=iso-2022-jp
  • 如果没有显式地列出字符集,接收方可能就要设法从文档内容中推断出字符集。对于 HTML 内容来说,可以在描述 charset 的 标记中找到字符集。
    <meta http-equiv="content-type" content="text/html; charset=iso-2022-jp">
  • 如果文档不是 HTML 类型,或其中没有 META Content-Type 标记,软件可以设法扫描实际的文本,看看能否找出语言和编码的常见模式,以此推断字符编码。
  • HTTP 客户端可以使用 Accept-Charset 请求首部来明确告知服务器它支持哪些字符系统。Accept-Charset 首部的值列出了客户端支持的字符编码方案。
    Accept-Charset: iso-8859-1, utf-8
  • 注意,没有 Content-Charset 这样的响应首部和 Accept-Charset 请求首部匹配。为了和 MIME 标准兼容,响应的字符集是由服务器通过 Content-Type 响应首部的 charset 参数带回来的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值