Darktea Home

一, 要解决的问题

给一段 Url 参数中编码过(可能用的是 GBK 编码,也可能用的是 UTF-8 编码)的中文串,

在不知道是哪种编码时(可能是 GBK,也可能是 UTF-8),要都能成功解出中文

例如对于 %C1%B9%D0%AC%C5%AE %E5%87%89%E9%9E%8B%E5%A5%B3

都要能解出中文:凉鞋女

本文的组织方式:

二, URL 的语法和编码

在讲 URL 的 ecoding 之前,需要先了解 URL 的语法。

1. URL 组成

URL 一般由几个部分组成。例如:

https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third
Part Data
Scheme https
User bob
Password bobby
Host address www.lunatech.com
Port 8080
Path /file
Path parameters p=1
Query parameters q=2
Fragment third

2. URL 的保留字

从 URL 的组成也可以看出, 有一些字符是 URL 的保留字。

但有需要特别注意:有些字符对 URL 所有的部分都是保留字;但有些字符只是对 URL 的某个部分是保留字。

:@-._~!$&'()*+,;=
/?:@-._~!$&'()*+,;=

3. URL 保留字编码

既然 URL 语法中存在保留字,那么当需要真正使用到这些保留字的时候,就需要对这些保留字进行编码(也就是转义),例如:英文问号(?)转为 %3F (%百分号开头,随后是16进制的数字)。

但就像前面提到的,URL 各个部分的保留字不同;所以,各个部分的 encoding 规则也不同。例如:

Query 部分的例子:

blue+light blue

应该被编码为:blue%2Blight+blue

结论

对 URL 转义的时候,不能对整个 URL 进行处理;而是需要分别对 URL 各个部分做处理。

这里我们只关注请求参数的编码请求参数中:

4. 非 ASCII 字符的 URL 编码

根据 URL 规范,将非 ASCII 字符按照某种 编码格式 编码成 16 进制数字然后将每个 16 进制表示的字节前加上“%”

这里所说的 编码格式 对我们来说就是两种编码 GBK,UTF-8 中的一种。

5. 例子

凉鞋女:

编码工具:

所以其 URL 编码分别为(每Byte前加一个百分号):

三, 字符集及字符集编码

1. 字符集

2. 字符集编码

字符集编码:计算机里面怎么存储、传输Unicode字符。例如:UTF-8,UTF-16,UTF-32 。。。

3. GBK

既是一种字符集又是一种编码。

4. Unicode编码

Unicode 字符集目前的范围是 U+0000~U+10FFFF。对 Unicode 字符集有多种编码。

5. Java 中的字符集编码

String使用 UTF-16(2字节或者4字节):

String chinese="ab中文”
String b= new String(bs,“GBK"); // bs is a byte array

Refer:

四, 问题解决方案

String a= new String(bs,“UTF-8");
String b= new String(bs,“GBK");

五, References: