4月阅读周·HTTP权威指南:国际化之HTTP对国际性内容的支持篇
引言
HTTP(Hypertext Transfer Protocol,超文本传输协议)是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。
《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。
这本书主要包括以下内容:
- 第一部分描述了Web的基础构件与HTTP的核心技术
- 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
- 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
- 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
- 第五部分介绍了发布和传播Web内容的技巧。
- 第六部分是一些很有用的参考附录,以及相关技术的教程。
国际化
每天有上亿的人用数百种语言写着各种文档。为了真正实现万维网的目标,HTTP要能够传输和处理用多种语言和字母表编写的国际性文档。
网站国际化方面的两个主要问题:字符集编码(character set encoding)和语言标记(language tag)。HTTP应用程序使用字符集编码请求和显示不同字母表中的文本,它们使用语言标记根据用户所理解的语言来说明并限制内容。
HTTP对国际性内容的支持
HTTP报文中可以承载以任何语言表示的内容,就像它能承载图像、影片,或任何类型的媒体那样。对HTTP来说,实体主体只是二进制信息的容器而已。
为了支持国际性的内容,服务器需要告知客户端每个文档的字母表和语言,这样客户端才能正确地把文档中的信息解包为字符并把内容呈现给用户。
下面的HTTP报文中的这些Accept首部可能是母语为法语的人发出的。他喜欢使用母语,但也会说一点儿英语,他的浏览器支持iso-8859-1西欧字符集编码和UTF-8Unicode字符集编码:
Accept-Language: fr, en; q=0.8
Accept-Charset: iso-8859-1, utf-8
参数“q=0.8”是质量因子(quality factor),说明英语的优先级(0.8)比法语低(默认值是1.0)。
字符集与HTTP
现在我们进入主题,开始研究网站国际化中最重要(且令人困惑)的方面——各国的字母表和它们的字符集编码。Web字符集标准很有些令人迷惑。由于必须阅读很多标准文档,其中术语复杂且不一致,再加上对外语不太熟悉,很多人首次尝试编写国际化的网站软件时,都被搞糊涂了。
字符集是把字符转换为二进制码的编码
HTTP字符集的值说明如何把实体内容的二进制码转换为特定字母表中的字符。每个字符集标记都命名了一种把二进制码转换为字符的算法(反之亦然)。字符集标记在由IANA维护的MIME字符集注册机构进行了标准化。附录H中概述了其中的很多字符集。
下面的Content-Type首部告知接收者,传输的内容是一份HTML文件,用charset参数告知接收者使用iso-8859-6阿拉伯字符集的解码算法把内容中的二进制码转换为字符:
Content-Type: text/html; charset=iso-8859-6
iso-8859-6的编码算法把8位值域映射为拉丁字母和阿拉伯字母,以及数字,标点和其他符号。例如,在图16-1中,突出显示的二进制码的值是225,它在iso-8859-6中被映射到阿拉伯字母“FEH”(读音类似英语字母F)。
有些字符编码(比如UTF-8和iso-2022-jp)更加复杂,它们是可变长(variable-length)编码,也就是说每个字符的位数都是可变的。这种类型的编码允许使用额外的二进制位表示拥有大量字符的字母表(比如汉语和日语),仅用较少的二进制位来表示标准的拉丁字符。
字符集和编码如何工作
现在我们来看看字符集和编码到底做了什么。
我们想把文档中的二进制码转换为字符以便显示在屏幕上。但由于有很多不同的字母表,也有很多不同的方法把字符编码成二进制码(这些方法各有优缺点),我们需要一种标准方法来描述并应用把二进制码转换为字符的解码算法。
把二进制码转换为字符要经过两个步骤,
- 文档中的二进制码被转换成字符代码,它表示了特定编码字符集中某个特定编号的字符。在这个例子里,解码后的字符代码是数字编号225。
- 字符代码用于从编码的字符集中选择特定的元素。在iso-8859-6中,值225对应阿拉伯字母“FEH”。在步骤a和b中使用的算法取决于MIME的charset标记。
Accept-Charset首部
在过去的几十年间,人们开发了成千上万种字符编解码方法。大多数客户端不可能支持所有这些不同的字符编码和映射系统。
HTTP客户端可以使用Accept-Charset请求首部来明确告知服务器它支持哪些字符系统。Accept-Charset首部的值列出了客户端支持的字符编码方案。例如,下面的HTTP请求首部表明,客户端接受西欧字符系统iso-8859-1和UTF-8变长的Unicode兼容系统。服务器可以随便选择这两种字符编码方案之一来返回内容。
Accept-Charset: iso-8859-1, utf-8
注意,没有Content-Charset这样的响应首部和Accept-Charset请求首部匹配。为了和MIME标准兼容,响应的字符集是由服务器通过Content-Type响应首部的charset参数带回来的。不对称真是太糟了,不过需要的信息倒是都有了。
总结
服务器通过HTTP协议的Content-Type首部中的charset参数和Content-Language首部告知客户端文档的字母表和语言。这些首部描述了实体主体的“信息盒子”里面装的是什么,如何把内容转换成合适的字符以便显示在屏幕上以及里面的词语表示的是哪种语言。
同时,客户端需要告知服务器用户理解何种语言,浏览器上安装了何种字母表编码算法。客户端发送Accept-Charset首部和Accept-Language首部,告知服务器它理解哪些字符集编码算法和语言以及其中的优先顺序。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞 | 收藏⭐️ | 留言。
- 随机文章
- 热门文章
- 热评文章
- 中学生心理健康测试:关注成长,关爱心灵中学生心理健康测试网站
- 爱因斯坦的智商测试题怎么做?爱因斯坦的智力挑战
- 免费测你的性格和《三叉戟》中的谁最像
- 鸿蒙动画与交互设计:ArkUI 3D变换与手势事件详解
- 测测你的脾气爆炸点是什么
- 四双眼睛选一 测测你善良还是伪善
- Struts2框架小知识
- 性格心理测试 暴力倾向心理测试
- 个性测试 测测你有多招人羡慕嫉妒