📜  有效字符在 rfc 7230 和 rfc 3986 中定义 (1)

📅  最后修改于: 2023-12-03 15:10:38.414000             🧑  作者: Mango

有效字符在 RFC 7230 和 RFC 3986 中定义

RFC(Request for Comments)是 Internet 工程任务组(IETF)制定的一套文件,用于定义各种协议、算法、协议栈等互联网相关的标准规范。

RFC 7230 和 RFC 3986 分别定义了 HTTP/1.1 协议和 URI(Uniform Resource Identifier)规范。有效字符是其中一个重要的概念,在程序员进行 URI 处理或 HTTP 报文解析时必须要特别关注。

1. URI 中的有效字符

URI 通常用来标识互联网上的资源,包括网页、文本、图像、音频等等。RFC 3986 定义了 URI 的格式和用法,其中有效字符分为以下几类:

1.1 保留字符

URI 中的保留字符代表了特定含义,例如:

  • :(冒号)用于分隔协议和其他部分;
  • /(斜杠)用于分隔路径中的不同级别;
  • ?(问号)用于表示查询参数;
  • #(井号)用于表示片段。

以下是 URI 中的保留字符列表:

: / ? # [ ] @ ! $ & ' ( ) * + , ; = 

由于保留字符的含义特殊,如果要在 URI 中使用它们的字面量,需要进行转义。转义之后字符的表示方式为“%”加上两个十六进制数字,例如“%20”代表空格字符。

1.2 非保留字符

除了保留字符之外,在 URI 中还可以使用一些能直接表示自己的字符,称为非保留字符。如下是 URI 中的非保留字符列表:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
a b c d e f g h i j k l m n o p q r s t u v w x y z 
0 1 2 3 4 5 6 7 8 9 - _ . ~ 

注意,URI 中的大小写敏感,因此 “a” 和 “A” 是不同的字符。

1.3 百分号编码

除了保留字符和非保留字符之外, URI 中的其它字符必须使用百分号编码进行表示,如空格字符用 %20 表示,汉字 “中” 字符用 %E4%B8%AD 表示。

2. HTTP 报文中的有效字符

HTTP(Hypertext Transfer Protocol)协议是用于 Web 通信的一种应用层协议,定义了请求方法、状态码、报文格式等内容。RFC 7230 定义了 HTTP 报文的格式和用法,其中有效字符包括:

2.1 可见 ASCII 字符

可见 ASCII 字符是指 ASCII 码在 33 到 126 之间的字符。这些字符包括大小写字母、数字、常见标点符号等,如:

! " # $ % & ' ( ) * + , - . / 
0 1 2 3 4 5 6 7 8 9 
: ; < = > ? @ 
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
[ \ ] ^ _ \` 
a b c d e f g h i j k l m n o p q r s t u v w x y z 
{ | } ~  
2.2 空白字符

空白字符包括空格和水平制表符。在 HTTP 报文中,空白字符可以用于分隔字段值和多行数据,但不应该出现在字段名和字段值之间。

2.3 控制字符

控制字符是 ASCII 码在 0 到 31 之间的字符,以及 ASCII 码为 127 的删除字符(DEL)。这些字符属于不可见字符,可能会引起解析错误或安全问题,因此不能出现在 HTTP 报文中。

2.4 8 位字节序列

由于 HTTP 报文可用于传输多种类型的数据,包括图像、音频、视频等等。这些数据的字节序列可能包含任意 8 位字符(即 ASCII 码以外的字符)。在传输时需要进行编码(如 base64 编码)以确保可见字符的范围内。

结语

了解 URI 和 HTTP 报文中的有效字符对于程序员处理 Web 开发中的数据、参数和错误异常非常重要。在解析和构造 URI 和 HTTP 报文时务必按照规范进行字符转义、编码和解码等操作,以确保数据的正确性和安全性。