第16章 国际化
厘清字符、字符集、编码、字形、语言标记、国际化URI、日期和域名
第16章 国际化
“第16章 国际化”锁定David Gourley、Brian Totty、Marjorie Sayer、Sailu Reddy、Anshu Aggarwal著,陈涓、赵振平译《HTTP权威指南》,人民邮电出版社,2012年,ISBN 9787115281487;英文原版HTTP: The Definitive Guide,O'Reilly Media,2002年9月,656页,ISBN 1565925092。O'Reilly官方页面确认英文首版的5个正文部分、21章和8个附录;中文版完整印刷目录另含“第六部分 附录”和索引。忠实度分母共586个部分、章、编号节/小节、附录与索引节点。
“第16章 国际化”未取得未获授权的完整中文正文;课程以 O’Reilly 官方在线版 与 章级导览 界定首版范围,中文解释、报文、实验和练习均为独立教学重写。现代语义仅以 RFC 9110、RFC 9111 和 RFC 9112 核对差异。
学习目标
- 能解释“第16章 国际化”的全部正式节点及其HTTP事务位置。
- 能绘制请求、响应、TCP连接、中间实体和资源状态。
- 能设计单变量实验,验证“内容字节、charset、语言标记、转义和显示结果能沿编码链双向复原”。
- 能写出含首版边界、原始报文、故障、恢复和复核人的证据包。
从一条可证伪的HTTP事务开始
先预测:把字符集、字符编码和字体混为一谈会导致乱码与错误协商。把预测写成“URL/资源、连接、请求报文、中间实体、响应报文、身份与编码”六行,再运行客户端、代理或服务器。结果不同先定位首个字节或状态偏差。
本页主问题是:厘清字符、字符集、编码、字形、语言标记、国际化URI、日期和域名。每条消息要注明发送者、接收者、HTTP版本、连接复用、逐跳/端到端首部、主体边界与历史协议状态。
验收不变量是:内容字节、charset、语言标记、转义和显示结果能沿编码链双向复原。最终页面正常、状态码200或TLS通道建立都只是局部事实,不能单独证明资源身份、缓存变体、代理转发与证书身份全部正确。
核心词汇与首版边界
↡定义字符集合及字符到编码位置关系的标准、↡把字符编码位置转换为具体字节序列的方法、↡以层次子标记描述内容自然语言的标识、↡字符在特定字体与排版语境中的视觉表现、↡处理非ASCII字符表示与转义的URI议题
这些词汇固定在2002年英文首版和2012年中译本语境。在“第16章 国际化”中,HTTP/2、HTTP/3、OAuth、JWT、SameSite、HSTS和现代CDN行为只作独立比较,不得替换HTTP-NG、Digest、WebDAV、WPAD等首版节点。
核心机制深读
先从字符集画出事务
厘清字符、字符集、编码、字形、语言标记、国际化URI、日期和域名。先固定资源身份和请求目标,再标出客户端、中间实体与源服务器,任何优化或安全结论都不能跳过原始报文。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
区分字符集与字符编码
字符集和字符编码可能在同一事务中协作,但责任、状态位置和失败语义不同。对比正常请求、单个首部变化和单个连接故障,定位首个偏差。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
让语言标记经过真实中间实体
代理、缓存、网关或隧道会读取、添加、删除或转发不同首部。逐跳记录Via、Connection列出的字段、缓存决策和认证边界。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
验证字形的历史语境
原书写于2002年,以HTTP/1.0、HTTP/1.1、SSL/TLS早期版本和当时Web基础设施为背景。现代实现可做对照,但不能冒充原书节点。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
用国际化URI关闭证据门
内容字节、charset、语言标记、转义和显示结果能沿编码链双向复原。证据至少包含原始请求/响应、TCP时间线、中间状态、失败注入、恢复动作和第三方复核。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
首版机制逐项深读
第16章 国际化
“第16章 国际化”的边界涉及注册名称、大小写规则、转义和旧客户端容错;本地默认字符集不能成为跨系统协议。
16.1 http 对国际性内容的支持
验证“16.1 http 对国际性内容的支持”用同一文本的两种编码或语言表示,改变一个 Accept 或 Content 元数据并检查协商、缓存变体与显示结果。
16.2 字符集与http
“16.2 字符集与http”区分字符编码、语言标记与显示字形:发送端声明表示元数据,接收端按注册规则解析,不能由外观猜测。
16.2.1 字符集是把字符转换为二进制码的编码
“16.2.1 字符集是把字符转换为二进制码的编码”描述表示字节及其封装:媒体类型说明格式,内容编码说明变换,长度或分块界定边界,验证器和范围支持局部传输。
16.2.2 字符集和编码如何工作
核对“16.2.2 字符集和编码如何工作”要保存编码前后实体、Content-Type、Content-Encoding、线路长度与解码长度,避免把传输编码误当资源格式。
16.2.3 字符集不对,字符就不对
分析“16.2.3 字符集不对,字符就不对”要同时保存原始字节、声明的 charset 或 language 与解码后的码点;字体渲染正确不代表编码声明正确。
16.2.4 标准化的mime charset 值
验证“16.2.4 标准化的mime charset 值”用完整实体、截尾实体和局部范围三组字节,比较边界解析、摘要或验证器与最终表示是否一致。
16.2.5 content-type 首部和charset 首部以及meta 标志
“16.2.5 content-type 首部和charset 首部以及meta 标志”由发送者意图与接收者结果共同决定;状态成功并不能证明方法安全、幂等或表示完整。
16.2.6 accept-charset 首部
“16.2.6 accept-charset 首部”必须在线路语义中判断:请求方法声明意图,状态码表达处理结果,首部携带元数据,主体边界由明确的报文规则确定。
16.3 多语言字符编码入门
“16.3 多语言字符编码入门”描述表示字节及其封装:媒体类型说明格式,内容编码说明变换,长度或分块界定边界,验证器和范围支持局部传输。
16.3.1 字符集术语
验证“16.3.1 字符集术语”用同一文本的两种编码或语言表示,改变一个 Accept 或 Content 元数据并检查协商、缓存变体与显示结果。
16.3.2 字符集的命名很糟糕
分析“16.3.2 字符集的命名很糟糕”要同时保存原始字节、声明的 charset 或 language 与解码后的码点;字体渲染正确不代表编码声明正确。
16.3.3 字符
验证“16.3.3 字符”用同一文本的两种编码或语言表示,改变一个 Accept 或 Content 元数据并检查协商、缓存变体与显示结果。
16.3.4 字形、连笔以及表示形式
“16.3.4 字形、连笔以及表示形式”区分字符编码、语言标记与显示字形:发送端声明表示元数据,接收端按注册规则解析,不能由外观猜测。
16.3.5 编码后的字符集
“16.3.5 编码后的字符集”的失败会表现为消息串线、解码错误或错误变体;仅凭 200 状态无法证明实体完整且可解释。
16.3.6 字符编码方案
解释“16.3.6 字符编码方案”时先写原始 URI,再标出规范化与百分号编码的位置;客户端显示文本不能替代真正发送的请求目标字节。
16.4 语言标记与http
“16.4 语言标记与http”的边界涉及注册名称、大小写规则、转义和旧客户端容错;本地默认字符集不能成为跨系统协议。
16.4.1 content-language 首部
“16.4.1 content-language 首部”由发送者意图与接收者结果共同决定;状态成功并不能证明方法安全、幂等或表示完整。
16.4.2 accept-language 首部
“16.4.2 accept-language 首部”必须在线路语义中判断:请求方法声明意图,状态码表达处理结果,首部携带元数据,主体边界由明确的报文规则确定。
16.4.3 语言标记的类型
“16.4.3 语言标记的类型”区分字符编码、语言标记与显示字形:发送端声明表示元数据,接收端按注册规则解析,不能由外观猜测。
16.4.4 子标记
验证“16.4.4 子标记”用同一文本的两种编码或语言表示,改变一个 Accept 或 Content 元数据并检查协商、缓存变体与显示结果。
16.4.5 大小写
“16.4.5 大小写”在本章用于回答“厘清字符、字符集、编码、字形、语言标记、国际化URI、日期和域名”。学习时必须把这个名称落到具体报文、连接、中间状态或历史规范,并说明它改变了哪项可观察结果。
16.4.6 iana 语言标记注册
验证“16.4.6 iana 语言标记注册”用同一文本的两种编码或语言表示,改变一个 Accept 或 Content 元数据并检查协商、缓存变体与显示结果。
16.4.7 第一个子标记——名字空间
分析“16.4.7 第一个子标记——名字空间”要同时保存原始字节、声明的 charset 或 language 与解码后的码点;字体渲染正确不代表编码声明正确。
16.4.8 第二个子标记——名字空间
验证“16.4.8 第二个子标记——名字空间”用同一文本的两种编码或语言表示,改变一个 Accept 或 Content 元数据并检查协商、缓存变体与显示结果。
16.4.9 其余子标记——名字空间
“16.4.9 其余子标记——名字空间”区分字符编码、语言标记与显示字形:发送端声明表示元数据,接收端按注册规则解析,不能由外观猜测。
16.4.10 配置和语言有关的首选项
“16.4.10 配置和语言有关的首选项”区分字符编码、语言标记与显示字形:发送端声明表示元数据,接收端按注册规则解析,不能由外观猜测。
16.4.11 语言标记参考表
验证“16.4.11 语言标记参考表”用同一文本的两种编码或语言表示,改变一个 Accept 或 Content 元数据并检查协商、缓存变体与显示结果。
16.5 国际化的uri
“16.5 国际化的uri”用基准 URI、目标 URI 与最终请求目标三列核对,尤其区分相对引用解析、默认端口和只在客户端使用的片段。
16.5.1 全球性的可转抄能力与有意义的字符的较量
“16.5.1 全球性的可转抄能力与有意义的字符的较量”区分字符编码、语言标记与显示字形:发送端声明表示元数据,接收端按注册规则解析,不能由外观猜测。
16.5.2 uri 字符集合
解释“16.5.2 uri 字符集合”时先写原始 URI,再标出规范化与百分号编码的位置;客户端显示文本不能替代真正发送的请求目标字节。
16.5.3 转义和反转义
“16.5.3 转义和反转义”用基准 URI、目标 URI 与最终请求目标三列核对,尤其区分相对引用解析、默认端口和只在客户端使用的片段。
16.5.4 转义国际化字符
“16.5.4 转义国际化字符”用基准 URI、目标 URI 与最终请求目标三列核对,尤其区分相对引用解析、默认端口和只在客户端使用的片段。
16.5.5 uri 中的模态切换
解释“16.5.5 uri 中的模态切换”时先写原始 URI,再标出规范化与百分号编码的位置;客户端显示文本不能替代真正发送的请求目标字节。
16.6 其他需要考虑的地方
“16.6 其他需要考虑的地方”在本章用于回答“厘清字符、字符集、编码、字形、语言标记、国际化URI、日期和域名”。学习时必须把这个名称落到具体报文、连接、中间状态或历史规范,并说明它改变了哪项可观察结果。
16.6.1 首部和不合规范的数据
“16.6.1 首部和不合规范的数据”由发送者意图与接收者结果共同决定;状态成功并不能证明方法安全、幂等或表示完整。
16.6.2 日期
“16.6.2 日期”的边界涉及注册名称、大小写规则、转义和旧客户端容错;本地默认字符集不能成为跨系统协议。
16.6.3 域名
“16.6.3 域名”区分字符编码、语言标记与显示字形:发送端声明表示元数据,接收端按注册规则解析,不能由外观猜测。
16.7 更多信息
“16.7 更多信息”是原书的延伸资料入口,不增加新的协议结论;使用时必须记录资料版本、适用的 HTTP 年代和与本章结论的对应关系。
16.7.1 附录
“16.7.1 附录”是结构节点,用来组织“厘清字符、字符集、编码、字形、语言标记、国际化URI、日期和域名”的学习范围;它负责串联相邻机制与证据,不把目录标题本身当作知识解释。
16.7.2 互联网的国际化
“16.7.2 互联网的国际化”的边界涉及注册名称、大小写规则、转义和旧客户端容错;本地默认字符集不能成为跨系统协议。
16.7.3 国际标准
“16.7.3 国际标准”区分字符编码、语言标记与显示字形:发送端声明表示元数据,接收端按注册规则解析,不能由外观猜测。
复原原始HTTP事务
固定URL、资源、连接与版本,写出请求行、首部、主体、响应和所有中间实体。
HTTP/1.1 message laboratory
第16章 国际化
厘清字符、字符集、编码、字形、语言标记、国际化URI、日期和域名
GET /resource?chapter=%E7%AC%AC16%E7%AB%A0%20%E5%9B%BD%E9%99%85%E5%8C%96 HTTP/1.1 Host: example.test Connection: keep-alive
章内坐标:第16章 国际化、16.1 http 对国际性内容的支持、16.2 字符集与http、16.2.1 字符集是把字符转换为二进制码的编码、16.2.2 字符集和编码如何工作、16.2.3 字符集不对,字符就不对、16.2.4 标准化的mime charset 值、16.2.5 content-type 首部和charset 首部以及meta 标志
可复现实验记录
GET /resource HTTP/1.1
Host: example.test
Connection: keep-alive
Accept: */*HTTP/1.1 200 OK
Date: Tue, 01 Jan 2002 00:00:00 GMT
Content-Type: text/plain
Content-Length: 5
helloevidence = request_bytes + response_bytes + tcp_timeline + intermediary_state + recovery动手试:保存一次正常请求、一次缓存或连接边界和一次单变量故障。记录客户端、代理、缓存、网关与源服务器看到的原始报文,以及统一时间戳和恢复动作。
独立证据门
最小证据包包含:首版节点、URL、原始请求/响应、连接时间线、代理与缓存决策、身份和编码、单变量故障、恢复、偏差、责任人与复核人。
练习
练习
问题 1:为什么“第16章 国际化”必须固定2002年首版?
问题 2:怎样构造“把字符集、字符编码和字体混为一谈会导致乱码与错误协商”的最小反例?
问题 3:何时可以认为本页完成独立交接?
本章回顾
“第16章 国际化”的核心是厘清字符、字符集、编码、字形、语言标记、国际化URI、日期和域名。真正掌握不是记首部名,而是能用原始报文、连接和中间状态证明资源如何被定位、传输、缓存、保护与交付。
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 字符集
定义字符集合及字符到编码位置关系的标准。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。
- 字符编码
把字符编码位置转换为具体字节序列的方法。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。
- 语言标记
以层次子标记描述内容自然语言的标识。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。
- 字形
字符在特定字体与排版语境中的视觉表现。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。
- 国际化URI
处理非ASCII字符表示与转义的URI议题。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。