无需登录 数据私有 本地保存

Accept-Language 解析与匹配器 - 内容协商语言

15
0
0
0

Accept-Language 解析与匹配器

HTTP 内容协商 · 语言标签解析 · q值排序 · 最佳匹配 · RFC 4647

快速场景:
格式: 语言范围,语言范围;q=值,... 默认q=1.0
格式: 语言标签,语言标签,... 逗号分隔,按优先级排列

输入 Accept-Language 和服务器语言列表,点击解析按钮查看匹配结果

常见问题与知识点

Accept-Language 是 HTTP 请求头之一,用于告知服务器用户代理(浏览器)偏好哪些自然语言。它是 HTTP 内容协商(Content Negotiation)机制的核心组成部分。

当浏览器发起请求时,会根据用户的操作系统语言设置或浏览器语言偏好,自动生成 Accept-Language 头。服务器读取该头信息,结合自身支持的语言列表,选择最合适的语言版本返回给用户。

典型值示例:zh-CN,zh;q=0.9,en;q=0.8 — 表示用户最偏好简体中文,其次接受任何中文变体(q=0.9),再次接受英文(q=0.8)。

q值(quality value,质量值)是一个介于 0 到 1 之间的浮点数,用于表示语言偏好的权重。q值越接近 1,表示该语言的优先级越高。

  • 默认值:如果语言范围未指定 q 值,则默认为 1.0(最高优先级)。
  • q=0:表示该语言不可接受,服务器不应返回该语言的内容。这在需要明确排除某种语言时使用。
  • 精度:q值通常保留 1-3 位小数,如 q=0.9q=0.85
  • 排序:解析后应按 q 值从高到低排序,q 值相同时保持原始顺序。

示例:zh-CN,zh;q=0.9,en;q=0.8 中,zh-CN 的 q=1.0(默认),zh 的 q=0.9,en 的 q=0.8。

语言标签遵循 BCP 47(Best Current Practice 47)规范,由 RFC 5646 定义。标签由连字符 - 分隔的子标签组成:

组成部分说明示例
主语言2 字母 ISO 639-1 或 3 字母 ISO 639-2/3zh, en, ja
脚本(可选)4 字母 ISO 15924Hans(简体), Hant(繁体)
地区(可选)2 字母 ISO 3166-1 或 3 数字 UN M.49CN, US, GB
变体(可选)特定变体标识pinyin, wadegile

常见组合:zh-CN(中文-中国大陆)、zh-Hans-CN(简体中文-中国大陆)、en-US(英语-美国)、ja-JP(日语-日本)。

根据 RFC 4647,语言范围匹配使用基本过滤规则:

  1. 精确匹配:语言范围与语言标签完全一致。如 zh-CN 匹配 zh-CN
  2. 前缀匹配:语言范围是语言标签的前缀,且前缀后紧跟 -。如 zh 匹配 zh-CN(zh 是前缀,后面是 -CN)。
  3. 通配符 *匹配所有语言标签,通常作为兜底选项,q 值设置较低。
  4. 注意:zh-CN 不会匹配 zh(因为 zh-CN 不是 zh 的前缀)。

匹配时按 Accept-Language 中 q 值从高到低依次尝试,第一个成功匹配的服务器语言即为最佳匹配。q=0 的条目会被跳过。

服务端处理 Accept-Language 的最佳实践:

  • 解析请求头:从 HTTP 请求中读取 Accept-Language 头,按逗号分割,提取语言范围和 q 值。
  • 准备语言列表:维护一个服务器支持的语言列表,按优先级排列(如 ['en-US', 'zh-CN', 'ja-JP'])。
  • 执行匹配:对每个 Accept 条目(按 q 值排序),在服务器列表中找到第一个匹配的语言。
  • 兜底策略:如果所有条目都无法匹配,返回服务器默认语言或列表中的第一个语言。
  • 框架支持:大多数 Web 框架(如 Express.js 的 accepts 包、Django 的 get_language_from_request)已内置此功能。

也可在反向代理层(如 Nginx)通过 $http_accept_language 变量进行处理。

浏览器的 Accept-Language 通常自动生成,基于以下来源:

  • 操作系统语言设置:浏览器会读取操作系统的首选语言和区域设置。
  • 浏览器语言设置:用户可以在浏览器设置中手动调整语言偏好顺序(Chrome: chrome://settings/languages,Firefox: about:preferences#general)。
  • 隐私考量:Accept-Language 可能被用于浏览器指纹识别,因为不同用户的语言组合具有辨识度。

开发者可以通过浏览器开发者工具的网络面板查看实际发送的 Accept-Language 值。部分浏览器扩展也允许自定义该请求头。

通配符 *

  • 表示"接受任何语言",通常作为兜底选项放在列表末尾,q 值设置较低。
  • 例如 zh-CN,zh;q=0.9,*;q=0.1 表示优先中文,但如果服务器不支持中文,也接受任何其他语言。
  • 单独使用 * 表示接受所有语言,服务器通常会返回其默认语言。

q=0:

  • 明确表示"不接受"该语言。例如 zh-CN,en;q=0 表示只接受中文,明确拒绝英文。
  • 在匹配算法中,q=0 的条目会被跳过,不会参与匹配。
  • 这在需要排除特定语言时非常有用,比如"我要中文,不要英文"。

结合使用:zh-CN,zh;q=0.9,*;q=0.5,en;q=0 — 偏好中文,接受任何语言,但明确拒绝英文。