Http权威指南笔记(十三)-国际化

2023-05-16

HTTP报文可以承载任何语言表示的内容的。因为对HTTP来说,实体主体真实二进制信息的容器而已。
在HTTP中为了支持国际性,服务器返回内容的同时需要告知客户端文档是用的什么字母表和语言等信息,这样客户端才能正确的解析出信息并显示字符。服务器可以通过Content-Type中的charset参数和Content-Language首部告知客户端字母表和语言信息。
同时,客户端并不是所有的字母表和语言都能进行处理,所以客户端在发起请求的时候,也可以通过发送Accept-CharsetAccept-Language首部,告知服务端自己所能处理的编码类型和语言。这两个首部也支持优先级,可以通过q参数设置优先级。
所以,HTTP中的国际化,也就是本篇要介绍的内容主要涉及到字符集编码(character set encoding)语言标记(language tag)

1 字符集和HTTP

1.1 字符集的概念

所谓字符集起始就是把字符转为二进制码的编码。HTTP 字符集的值说明如何把实体内容的二进制码转换为特定字母表中的字符。每个字符集标记都命名了一种把二进制码转换为字符的算法(反之亦然)。字符集标记在由 IANA 维护MIME字符集注册机构进行了标准化。一般通过Content-Type中的charset参数进行指定。如下:
Content-Type: text/html; charset=utf-8
其中utf-8就是一种编码算法,后面会有相关介绍。

1.2 字符集与编码

上面说了,字符集和编码目的就是为了将二进制信息同我们的字符进行转换。转换的具体流程一般经过两个步骤完成(这里以将二进制信息转为字符过程为例):

  1. 首先需要将二进制信息转为字符代码(某个字符集中的某个字符的特定编号);
  2. 得到这个代码后,我们再跟进这个代码从字符集中找到该代码对应的字符。

经过上面两个步骤,就能获得正确的字符了。而我们上面两个步骤都依赖于正确的charset值。如果该值不正确,同样一段二进制信息可能就会得出错误的字符代码,同样第二步中根据charset的值不同,字符代码和字符的对应关系也就不同。所以平时的乱码现象,有时候就是因为charset的值错误而引起。

charset的值使用的标准化的MIME charset标记。比如:utf-8, iso-8895-1, gbk等。这里不对每种编码做叙述,后续会对一些常见的编码方式做介绍。另外一点,该值一般来说是大小写不敏感的,在处理的时候需要注意这点。

1.3 客户端对字符集的处理

正常情况下,服务器会通过在Content-Type首部中使用charset参数告知客户端MIME字符集。但是如果服务器没有显示的返回信息,我们客户端可能就需要尽可能自己从文档内容判断出字符集。一般在HTML文档中,会通过<META HTTP-EQUIV="Content-Type">描述所用字符集信息。如下:

<HEAD>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gbk">
    <META LANG="jp">
    <TITLE>A Japanese Document</TITLE>
</HEAD>
<BODY>
...

该部分类容说明该html文档使用的gbk编码。

全世界范围类字符集编码非常多,服务器并不一定都是返回的客户端能正确处理的字符集。所以为了避免服务器端返回一些客户端无法处理的字符集,客户端在发送请求的时候,尽量通过Accept-Charset首部告知服务器,我们需要或者想要什么字符集,可以处理哪些字符集。

2 字符编码简介

前面我们介绍了服务器和客户端之间怎么协商处理字符集。本节是简单对字符编码的过程的一个简单入门介绍。

2.1 字符集术语

这里我们将一组把一系列 8 位字节转换为一系列字符的规则的集合称为字符集。其包括编码方案和编码后的字符集。在介绍字符集的时候会用到一下一些术语:

  • 字符: 字符是指字母、数字、标点、表意文字(比如汉语)、符号,或其他文本形式的 书写“原子”。
  • 字形:字形是字符的一种表现形式,同一个字符可以有多重字形,比如同样一个汉字,宋体和楷体表现出的字形是有区别的。
  • 编码后的字符:分配给字符的唯一数字编号
  • 代码空间:计划用于字符代码值的整数范围
  • 代码宽度:每个字符代码所用的位数
  • 字符库:特定的工作字符集
  • 编码后的字符集:组成字符库的已经编码的字符集,并为每个字符分配代码空间中的一个代码。
  • 字符编码方案:把数字化的字符代码编码为二进制码的算法。

2.2 字符编码方案

上面我们介绍了一些相关的术语,理解到其意思后。我们来看下一些常见的字符编码方案。目前字符编码方案主要有以下3种:

  • 固定宽度
    固定宽度方式的编码用固定数量的比特表示每个编码后的字符。这种方式处理速度较快,但是会浪费一些空间
  • 可变宽度(无模态)
    顾名思义,可变宽度就是根据字符代码所需要的比特位,采用不同的宽度的比特进行存储。这样可以节约资源,而且还能根据需要利用多个字节来表示不同的文字,比如中午就需要两个字节
  • 可变宽度(有模态)
    有模态的编码使用特殊的“转义”模式在不同的模态之间切换(这个我也没有太理解其含义)。

常见编码示例:

  1. 8位固定宽度
    位固定宽度恒等编码把每个字符代码编码为相应的 8 位二进制值。它只能支持有 256 个字符代码范围的字符集。iso-8859 字符集家族系列使用的就是 8 位恒等编码。
  2. UTF-8
    这个应该是目前比较流行的一种通用编码了,能够处理很多语言。是一种无模态的可变宽度编码。第一字节的高位表示编码后的字符所用的字节数,所需的每个后续字节都含有 6 位的代码 值,其编码方式可以和ASCII编码兼容。如下表:
字符代码的二进制位字节 1字节 2字节 3字节 4字节 5字节 6
0-70ccccccc-----
8-11110ccccc10cccccc----
12-161110cccc10cccccc10cccccc---
17-2111110ccc10cccccc10cccccc10cccccc--
22-26111110cc10cccccc10cccccc10cccccc10cccccc-
27-311111110c10cccccc10cccccc10cccccc10cccccc10cccccc

3 语言标记与HTTP

语言标记是命名口语的标准化字符串短语。同时,我们需要对这个标记的字符串进行标准化,否者每个人都有自己的命名习惯,字符串格式都不一样,就无法从标记中提取出语言信息。

3.1 Content-Language和Accept-Language首部

实体的 Content-Language 首部字段描述实体的目标受众语言,其不限于文本文档。音频片段、电影以及应用程序都有可能是面向特定语言受众的。任何面向特定语言受众的媒体类型都可以有 Content-Language 首部。同时我们也可以在该首部指定多个语言,如:Content-Language: en, fr
相对应的,客户端也可以通过Accept-Language告知服务端我们能够接受的语言种类。其优先顺序从左至右

3.2 语言标记的类型

在 RFC 3066,“Tags for the Identification of Languages”(标识语言的标记)中记录了语言标记的标准化语法。可以用语言标记来表示:

  • 一般的语言分类(比如 es 代表西班牙语);
  • 特定国家的语言(比如 en-GB 代表英国英语);
  • 语言的方言(比如 no-bok 指挪威的书面语);
  • 地区性的语言(比如 sgn-US-MA 代表美国马撒葡萄园岛上的手语);
  • 标准化的非变种语言(比如 i-navajo);
  • 非标准的语言(比如 x-snowboarder-slang)。

标记一般由一个或多个部分组成,中间由"-"分隔,示例如下:
语言标记格式
其中:

  • 第一个标记是称为主子标记,其值是标准化的
  • 第二个子标记是可选,遵循它自己的命名规则
  • 其他尾随的子标记是未注册的

第一子标记和第二子标记都是有专门的文档及相关组织专门维护和命名的,后面会介绍一些。其他的那些没有专门维护的,一般需要在IANA进行注册。这里所有的标记都是不区分大小写的。我们在解析的时候应该注意这点。

3.2.1 第一个子标记

第一个子标记通常是标准化的语言记号,选自 ISO 639 中的语言标准集合。不过也可以用字母 i 来标识在 IANA 中注册的名字,或用 x 表示私有的或者扩展的名字。其规则如下:

  • 如果只有2个字符,那就是来自 ISO 639 和 639-1 标准的语言代码,如ar, en等
  • 有3个字符,那就是来自 ISO 639-210 标准及其扩展的语言代码,如ara,eng等
  • 字母i,该语言标记是在 IANA 显式注册的
  • 字母 x,该语言标记是私有的、非标准的,或扩展的子标记。

关于ISO639,ISO639-2等文档这里就不详细介绍了,有兴趣的自己搜索来看看就清楚了。

3.2.2 第二个子标记

第二个子标记通常是标准化的国家记号,选自 ISO 3166 中的国家代码和地区标准集合。不过也可以是在 IANA 注册过的其他字符串,其规则如下:

  • 2 个字符,那就是 ISO 316611 中定义的国家 / 地区;如:CN,FR
  • 3~8 个字符,可能是在 IANA 中注册的值;
  • 单个字符,这是非法的情况。

4 国际化URI

本小节感觉了解的内容居多,所以这里就没有详细记录了。一般知道下面几点即可:

  1. URI允许使用ASCII字符集的子集
  2. URI字符被分为转义、保留和未保留三种,具体如下表所示:
字符类别字符列表
未保留[A-Za-z0-9]
保留“;”
转义“%” <HEX> <HEX>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Http权威指南笔记(十三)-国际化 的相关文章

  • mac终端 python scrapy爬虫 zsh: no matches found

    在学习Python爬虫时 xff0c 进行到scrapy板块 xff0c 执行genspider命令 输入scrapy genspider tongcheng https bj 58 com sou key 61 E5 89 8D E7 A
  • JSESSIONID的简单说明

    1 第一次访问服务器的时候 xff0c 会在响应头里面看到Set Cookie信息 只有在首次访问服务器的时候才会在响应头中出现该信息 上面的图JSESSIONID 61 ghco9xdnaco31gmafukxchph Path 61 a
  • 史上最全的常用开发工具类收集(持续更新中)

    外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img BtY85pbk 1577412535564 https img shields io badge QQ群 523167548 20 ff69b4 svg API
  • MFC学习之vc通过HTTP请求:Get或Post方式获取JSON信息(亲测可用)

    前段时间公司项目需要跟上一级平台对接一些采集回来的数据 xff0c 通过HTTP xff0c post方法上传JSON信息到指定的接口地址 本来呢 xff1f 我在入职时是面试的售后岗 xff0c 一家小公司 xff0c 当时公司软件方面一
  • mac安装虚拟机VMware fusion12 和ubantu系统

    一 基本安装 下载虚拟机VMware fusion12 我选择了不更新新版本并且允许访问辅助功能 选择 新建 接下来选择 从光盘或者映像安装 从下载目录把ubantu系统拖拽过去 点击安装完成 xff0c 将ubantu系统保存在虚拟机上即
  • VSCode常用命令---记录自己的常用命令

    一 nvm相关命令 node版本管理 查看已安装的版本 nvm list 使用版本 nvm use 版本号 安装版本 nvm install 版本号 卸载版本 nvm uninstall 版本号 常用命令 全局包安装 多用于gitee下载后
  • Ubuntu18.04 Realsense D435i驱动安装与配置

    InterRealSenseD435i SDK安装 一 命令行的安装方式安装 1 注册服务器的公钥 xff1a 打开终端输入 sudo apt key adv keyserver keys gnupg net recv key C8B3A5
  • Qt上位机:与STM32串口通信,数据收发,按钮控制LED

    Qt学习了几周 xff0c 做一个串口助手巩固一下最近学习的内容 遇到的问题1 xff1a write函数只能发送一次数据 xff0c 想要继续发送必须重新关闭打开串口 xff0c 每次只能发送一次数据 解决办法 xff1a 在网上找不到类
  • 考研数据结构2 | 使用 C++ 实现顺序栈 | 栈的基本应用之计算后缀表达式

    文章目录 1 顺序栈 简介2 顺序栈 代码实现3 栈的应用之计算后缀表达式3 1 表达式介绍3 2 计算后缀表达式的实现3 3 完整代码3 4 LeetCode 提交代码 1 顺序栈 简介 在上一次的学习中 xff0c 使用指针实现了链栈
  • C++使用libcurl做HttpClient

    C 43 43 使用libcurl做HttpClient 分类 xff1a 基础技术分享 2012 06 14 19 25 1469人阅读 评论 3 收藏 举报 当使用C 43 43 做HTTP客户端时 xff0c 目前通用的做法就是使用l
  • CAN的报文格式

    CAN的报文格式 在总线中传送的报文 xff0c 每帧由7部分组成 CAN协议支持两种报文格式 xff0c 其唯一的不同是标识符 xff08 ID xff09 长度不同 xff0c 标准格式为11位 xff0c 扩展格式为29位 在标准格式
  • uabntu系统安装软件:E: 无法定位软件包问题

    血泪教训 耽误了贼长时间 一开始参考了如下链接 xff0c 然而我的问题一个没解决 xff0c 哭了 Ubuntu sudo apt get install 出现 E 无法定位软件包问题 解决方法汇总 遥想在想peach的博客 CSDN博客
  • 右手定则

    http www 7wenta com zhuanti 9648 html 问他 首页问答中心竞技场 学习快报 达人榜商城 问他手机版 注册 登录 问他网 gt 学习专题 gt 高中物理 gt 右手定则 物理题库练习题我要提问
  • 【机器人规划】Bug解析

    文章目录 参考文献简介Bug1算法Bug2算法Tangent Bug算法关于O i的选择激光雷达半径对算法的影响 总结 参考文献 自动驾驶决策规划算法 Bug Algorithms Bug算法 Robotic Motion Planning
  • ubantu虚拟机无法联网

    在VMware中安装Ubuntu虚拟机 xff0c 总会发生无法上网的情况 xff0c 主要情况有以下几点 xff1a 宿主机可以上网 xff1b 虚拟机却无法访问网页虚拟机ping不通任何网站 xff0c 用浏览器显示error 一般情况
  • 半监督语义分割论文学习记录

    Semi Supervised Semantic Segmentation with Cross Consistency Training 1 1 motivation 一致性训练的目的是在应用于输入的小扰动上增强模型预测的不变性 因此 x
  • 使用Qt二次开发周立功CAN(一)

    使用Qt二次开发周立功CAN xff08 一 xff09 使用Qt二次开发周立功的CAN通信 xff0c 第一步需要完成动态链接库的加载 xff0c 成功加载之后才能调用其提供的接口函数 加载库需要注意的问题有两个 xff1a 一是Qt版本
  • 字节序基础知识

    在各种计算机体系结构中 xff0c 对于字节 字等的存储机制有所不同 xff0c 因而引发了计算机通信领 域中一个很重要的问题 xff0c 即通信双方交流的信息单元 xff08 比特 字节 字 双字等等 xff09 应该以什么样的顺序进行传
  • vlc命令行: 转码 流化 推流

    写在命令行之前的话 xff1a VLC不仅仅可以通过界面进行播放 xff0c 转码 xff0c 流化 xff0c 也可以通过命令行进行播放 xff0c 转码和流化 还可以利用里面的SDK进行二次开发 vlc命令行使用方法 xff1a 1 x
  • C++ 简单实现HTTP GET/POST 请求

    HTTP 超文本传输协议 是一种客户端与服务端的传输协议 xff0c 最早用于浏览器和服务器之间的通信 xff0c 后来因为其使用灵活 方便等特点 xff0c 广泛用于客户端与服务端的通信 文章将简单介绍HTTP协议 xff0c 同时以C

随机推荐

  • STM32单片机HAL库下串口接收不定长数据

    xff33 xff34 xff2d xff13 xff12 单片机 xff28 xff21 xff2c 库下串口接收不定长数据 xff28 xff21 xff2c 库下的串口接收不定长数据代码配置代码实现代码演示总结 xff28 xff21
  • C++将一个数据格式化为固定长度的字符串

    经常会遇到将数据解析为文本文件的现象 xff0c 通常因为数据长度的不同导致 xff0c 可视化效果不好 写一个输入数据获取固定长度字符串的函数 xff0c 来得到一个固定长度的数据 xff0c 让格式化看起来好看一些 include lt
  • Socket原理与编程基础

    一 Socket简介 Socket是进程通讯的一种方式 xff0c 即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换 几个定义 xff1a xff08 1 xff09 IP地址 xff1a 即依照TCP IP协议分
  • mac 安装brew

    起因是这样的 xff0c 我想在mac上安装htop 然后我了解到可以用brew安装htop 然后再执行命令 brew install htop 所以我就开始吭哧吭哧安装brew 过程xue wei 曲折了一些 先是看到一个文章 xff0c
  • 【项目学习】C++实现高并发服务器——代码学习(三)用户注册登录功能

    项目来源 xff1a WebServer 上一篇 xff1a 存储解析HTTP请求报文 xff0c 创建响应报文 本文介绍以下功能的代码实现 利用RAII机制实现了数据库连接池 xff0c 减少数据库连接建立与关闭的开销 xff0c 同时实
  • 用CSS3实现动画进度条

    CSS3的新特性为我们实现漂亮的进度条扫清了障碍 xff0c 我们可以完全不需要任何图片和简单的Javascript代码就可以构建 一 第一个例子 效果图 xff1a Demo地址 xff1a http namepk sinaapp com
  • tcpdump命令使用详解

    tcpdump命令使用详解 疯狂的小企鹅的博客 CSDN博客 tcpdump命令详解全网最详细的 tcpdump 使用指南 王一白 博客园Tcpdump抓包工具实战教程 xff0c 让你知道一个抓包走天下 xff01 哔哩哔哩 bilibi
  • Chrome浏览器Postman插件安装包及安装教程

    最近电脑装了新环境 xff0c 以前本地的postman安装包竟然找不到了 xff0c 网上费尽心力找了很多资源 xff0c 终于找到纯净的安装包 xff0c 绕开套路 xff0c 现将Postman安装包及安装教程分享给各位 xff0c
  • LayoutInflater的错误用法(Avoid passing null as the view root )

    今天在练习使用Fragment的时候 xff0c 注意到在使用LayoutInflater的时候有黄色报警 xff08 Avoid passing null as the view root needed to resolve layout
  • Android M(6.0)运行时权限申请及遇到的坑

    一 概述 在对动态权限申请进行详细说明时 xff0c 还是先大致介绍下6 0后 xff0c google对权限的一个归类和划分 在Android M之前 xff0c 再开发应用的时候 xff0c 程序员只需要在AndroidManifest
  • Android DataBinding介绍(一)——简介、数据及方法事件绑定

    简介 Data binding 是Google在2015年7月发布的Android Studio v1 3 0 版本上引入的 xff0c 在2016年4月Android Studio v2 0 0 上正式支持 引入之初 xff0c 不支持双
  • CoordinatorLayout的使用(一)——简单使用

    简介 CoordinatorLayout是Android support design推出的新布局 xff0c 主要用于作为视图根布局以及协调子控件的行为 xff08 根据用户的触摸行为产生一定的动画效果 xff09 主要是通过设置子Vie
  • BottomSheetDialog的使用及注意事项

    一 BottomSheetDialog简介 用途 xff1a 底部弹起的view或dialog 实现 xff1a 其关键也是CoordinatorLayout与Behavior 要求 xff1a 采用View的形式展示的话 xff0c 用于
  • mac设置mysql的环境变量

    1 终端输入 xff1a PATH 61 34 PATH 34 usr local mysql bin 这种每次重新进入终端都得写一次 xff0c 比较麻烦 xff1b 2 改变 zshrc文件 终端输入 xff1a vim zshrc 按
  • 关于解决自定义FloatingActionButton滑动行为(Behavior)只隐藏不出现的问题

    最近在使用FloatingActionButton的时候 xff0c 自定义了其Behavior xff0c 然后发现在SDK在25及以上的时候 xff0c 出现了只能隐藏不能重新出现的问题 xff08 24及以下没有出现此问题 xff09
  • NestedScrolling机制解析(二)——NestedScrollView源码

    上一篇文章我们介绍了NestedScrollingParent和NestedScrollingChild接口 xff0c 了解了两个接口里的方法和相互之间的调用关系 这篇我们以NestedScrollView类为例 xff0c 看先嵌套滚动
  • CoordinatorLayout的使用(四)——通过AppBarLayout源码分析联动机制

    一 整体交互逻辑 上一篇文章 xff0c 我们从CoordinatorLayout源码出发 xff0c 分析了一下Behavior几个重点方法的调用逻辑和流程 知道了整个交互的分发流程 但是具体是怎么让一个不是ScrollingView类型
  • Http权威指南笔记(十)——认证

    现在大多数网站都会在cookie等客户端识别机制的基础上建立自己的认证机制 但是HTTP规范中提供的原生认证机制还是有必要了解下 xff0c 了解这些后才能更好理解那些自己建立的认证机制 HTTP原生认证功能一般分为基本认证和摘要认证 基本
  • Http权威指南笔记(十二)——实体与编码

    本章会对HTTP实体和编码进行学习 这里的实体是指HTTP中真正需要传输的实体内容 xff08 比如一张图片 xff0c 一份文档 xff09 这里的编码主要是指内容编码和传输编码 1 报文与实体 如果将HTTP对内容的传输比喻成实际生活中
  • Http权威指南笔记(十三)-国际化

    HTTP报文可以承载任何语言表示的内容的 因为对HTTP来说 xff0c 实体主体真实二进制信息的容器而已 在HTTP中为了支持国际性 xff0c 服务器返回内容的同时需要告知客户端文档是用的什么字母表和语言等信息 xff0c 这样客户端才