什么字符集应该用于URL编码?

4

我需要对URL组件进行编码。URL组件可能包含特殊字符,例如“?”,“#”,“=”以及中文字符。

我应该使用哪个字符集:UTF-8、UTF-16还是UTF-32?为什么?


URL编码是完全不同于字符编码的东西。 - Jesper
5个回答

5
我想你的意思是百分号编码。 RFC 3986, section 2.5非常清楚(重点在于我):
当一个新的URI方案定义了一个表示来自通用字符集[UCS]的字符文本数据的组件时,该数据应首先根据UTF-8字符编码[STD63]编码为八位字节;然后只有那些不对应于未保留集中的字符的八位字节才应该进行百分比编码。例如,字符A将被表示为“A”,带有重音的大写拉丁字母A将被表示为“%C3%80”,片假名字母A将被表示为“%E3%82%A2”。
因此,这应该是UTF-8。
此外,请注意URLEncoder.encode();虽然它的建议一再重复,但事实上它并不适合URI编码;引用类本身的javadoc:
这个类包含用于将字符串转换为应用程序/x-www-form-urlencoded MIME格式的静态方法,这不是URI编码使用的方式。(如果你想知道,application/x-www-form-urlencoded是在HTTP POST数据中使用的) 你需要使用URI模板。例如,请参见此处

2

从HTML角度来看的参考。

HTML4规范,第B.2.1节,说明(我加粗了):

我们建议用户代理采用以下约定来处理这种情况中的非ASCII字符:

  1. UTF-8(见[RFC2279])中的每个字符表示为一个或多个字节。
  2. 使用URI转义机制对这些字节进行转义(即,将每个字节转换为%HH,其中HH是字节值的十六进制表示)。

同样,在HTML5规范中,选择表单提交编码部分基本上表示,如果未指定accept-charset属性,则应使用UTF-8

另一方面,我没有发现规定必须使用UTF-8。 一些较旧的软件特别使用iso-8859-1。例如,Apache Tomcat在8版之前将iso-8859-1作为其URIEncoding设置的默认值。


0

UTF-8(Unicode)是HTML5中的默认字符编码,因为它包含几乎所有的符号/字符。


0

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接