HTTP要能够传输和处理多种语言和字母表编写的国际性文档
两个主要问题:
字符集编码(character set encoding)和语言标记(language tag)。HTTP应用程序使用字符集编码请求和显示不同字母表中的文本,他们使用语言标记根据用户所理解的语言来说明并限制内容。
注意内容:
讲解HTTP如何与多语言字母表的方案和相关标准进行交互;
快速概览术语、技术和标准,以帮助HTTP编程人员正确理解。
解释对各种语言的标准命名系统,以及标准化的语言标记如何描述和选择内容。
概述国际性的URI要遵守的规则和注意事项;
简要讨论日期格式和其他国际化方面的问题。
16.1 HTTP对国际性内容的支持
对HTTP来说,实体主体只是二进制信息的容器而已。
服务器通过HTTP协议的Content-Type首部中的charset参数和Content-Language首部告知客户端文档的字母表和语言。
同时,客户端可以通过Accept-Charset首部和Accept-Language首部,告知服务器它理解哪些字符集编码算法和以及其中的有限顺序。
16.2 字符集和HTTP
各国的字母表和它们的字符集编码。
16.2.1 字符集是把字符转换为二进制码的编码
HTTP字符集的值说明如何把实体内容的二进制码转换为特定字母表中的字符。每个字符集标记都命名了一种把二进制码转换为字符的算法(反之亦然)。
Content-Type: text/html; charset=iso-8859-6
有定长编码和可变长编码(variable-length)。
16.2.2 字符集和编码如何工作
两步完成解码:
1.把二进制码转换成字符代码。
2.用字符代码从编码的字符集中选择特定的元素。
国际化关系系统的关键目标是把语义(字母)和表示(图形化的显示形式)隔离开来。
16.2.3 字符集不对,字符就不对
也就是同一个字符码如果使用不同的解码器会显示不同的字符。
16.2.4 标准化的MIME charset值
特定的字符编码方案和特定的已编码字符集组合成一个MIME字符集(MIME charset)。
16.2.5 Content-Type首部和Charset首部以及META标记
Web服务器通过在Content-Type首部中使用charset参数把MIME字符集标记发送给客户端:
Content-Type: text/html; charset=iso-2022-jp
如果没有这个首部,并且返回的是HTML文档,客户端可以通过<META HTTP-EQUIV="Content-Type">
标记中找到字符集。否则,可以根据字符编码模式去推断,或采用默认编码方式。
16.2.6 Accept-Charset首部
这个首部列出了客户端支持的编码方案。
16.3 多语言字符编码入门
本节是对字符系统及其标准的概览
16.3.1 字符集术语
字符:是指字母、数字、标点、表意文字(比如汉语)、符号,或其它文本形式的书写“原子”。
字形:描述字符的笔图案或唯一的图形化形状。
编码后的字符:分配给字符的唯一数字编号,这样我们就可以操作它了。
代码空间:计划用于代码值的整数范围。
代码宽度:每个(固定大小的)字符代码所用的位数。
字符库:特定的工作字符集(全体字符的一个子集)。
编码后得字符集:组成字符库(从全球的字符中选出若干字符)的已编码字符集,并为每个字符分配代码空间中的一个代码。换句话说,他把数字化的字符代码映射为实际的字符。
字符编码方案:把数字化的字符代码编码成一系列二进制码(并能相应的反向解码)的算法。字符编码方案可用来减少识别字符所需要的数据总量(压缩)、解决传输限制、统一重叠编码字符集。
16.3.2 字符集的命名很糟糕
从技术上说,MIME中的charset标记描述的压根就不是字符集。他的值所命名的是把数据位映射为唯一的字符的一整套算法。它是字符编码方案和编码后得字符集这两种概念的组合。
16.3.3 字符
一个字符可以有很多不同的书写形式。在很多书面语体系中,根据一个字符在单词中的不同位置,同一个字符也会有不同的笔画形状。
16.3.4 字形、连笔以及表示形式
每个字符可以有不同的字形。为了让书法好看,很多手写体和字体允许人们把相邻的字符漂亮的连写起来,称为“连笔”。
16.3.5 编码后得字符集
编码后的字符集把整数映射到字符。
1.US-ASCII:所有字符集的始祖
2.iso-8859:是US-ASCII的8位超集,使用二进制码的高位增加了一些国际化书面字符。由额外的二进制码提供的附加空间(多了128个代码)还不够大,甚至都不够所有的欧洲字符使用。它为不同地区定制了不同的字符集。
3.JIS X 0201: 是把ASCII扩展到日文半宽片假名字符的一个极小化的字符集。
4.JIS X0208 与JIS X 0212: 0208是首个多字节日文字符集。
5.UCSt:统一字符集是把全世界的所有字符整合到单一编码后字符集的环球标准化成果。
16.3.6 字符编码方案
规定如何把字符的代码数字打包装入内容比特,以及在另一端如何将其解包回字符代码。
有3中主要类型:
1.固定宽度:使用固定数量的比特表示每个编码后的字符,处理快但可能浪费空间。
2.可变宽度(无模态):可变宽度方式的编码对不同的字符代码数字采用不同数量的比特。对于常用字符,这样可以减少需要的位数,而且还能允许使用多字节来表示国际性字符的同时,保持对传统8位字符集的兼容。
3.可变宽度(有模态):使用特殊的“转义”模式在不同的模态之间切换。处理较复杂但可以有效地支持复杂的书写系统。
常见编码方案:
- 8位:如iso-8859系列字符家族。
- UTF-8: 是一种流行的为UCS设计的字符集编码方案,UTF表示UCS变换格式(UCS Transformation Format)。属于无模态的变宽编码,第一字节的高位表示编码后的字符所用的字节数,所需的每个后续字节都含有6位代码值。
16.4 语言标记和HTTP
语言标记是命名口语的标准化字符串短语。
en:英语
de:德语
ko:韩语
zh-xiang:汉语中的湖南话
16.4.1 Content-Language首部
描述实体的目标受众语言。音频片段、电影以及应用程序都可以有可能是面向特定语言受众的。
16.4.2 Accept-Language首部
HTTP允许我们把语言方面的限制和优选选择都发送给服务器。
16.4.3 语言标记的类型
16.4.4 子标记
语言标记有一个或多个部分,用连字号分隔,称为子标记。
马萨葡萄园岛上的手语用这个标记:sgn-US-MA。
16.4.5 大小写
所有的标记都是不区分大小写的。
16.4.6 IANA语言标记注册
第一个和第二个语言子标记的值由各种标准文档及相关的维护组织定义。IANA依据RFC 3066中概括的规则来管理标准的语言标记列表。
16.4.7 第一个子标记—名字空间
通常是标准化的语言记号,选自ISO 639中语言标准集合
16.4.8 第二个子标记—名字空间
通常是标准化的国家记号,选自ISO 3166的国家代码和地区标准集合。
16.4.9 其余子标记—名字空间
除了最长可以到8个字符外(字母和数字除外),第三个和其后的子标记没有什么特殊规则。
16.4.10 配置和语言有关的选项
可以在浏览器的配置文件中配置。
16.4.11 语言标记参考表
16.5 国际化的URI
目前,URI还没有为国际化提供足够的支持。URI还是由US-ASCII字符的一个子集组成的。
16.5.1 全球性的可转抄能力与有意义的字符的较量
16.5.2 URI字符集合
16.5.3 转义和反转义
16.5.4 转义国际化字符
16.5.5 URI中的模态切换
16.6 其他需要考虑的地方
16.6.1 首部和不合规的数据
HTTP首部必须由US-ASCII字符集中的字符组成。因为有的字符处理库会无法识别这些之外的编码从而导致错误。
16.6.2 日期
HTTP规范中明确定义了合法的GMT日期格式,但并不是所有的web服务器和客户端都遵守这些规则。
16.6.3 域名
DNS目前还不支持在域名中使用国际化的字符。正字支持多语言的域名的相关标准化工作,但还没有广泛的部署。