URL 中的字符集编码与乱码(下)--查询字符串中的字符集编码

深入介绍了 URL 中的转义编码, 用具体例子讲解了不同页面编码的情况下, 查询字符串转义时所使用的编码, 还顺带对 url 的组成结构作了介绍.

在上篇中, 初步谈论了 URL 中含有中文字符时的转义编码, 提到了所使用的编码是 utf-8.

不过你可能会有点疑问, 一定都是要用 utf-8 编码吗? 还是因为页面编码本身是 utf-8 的缘故呢? 毕竟在那个例子中, 页面的编码也恰好是 utf-8.

在 GBK 编码页面下的 URL 转义

这次, 将继续测试页面编码是 gbk 时的情况, 如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="GBK">
<title>带中文的 URL(GBK)</title>
</head>
<body>
	测试带中文的 URL,页面编码为:GBK
	<br> 中文链接:
	<a href="你好/index.html">你好/index.html</a>
	<br> 中文链接并带有中文查询字符串:
	<a href="你好/index.html?s=你好">你好/index.html?s=你好</a>
</body>
</html>

继续阅读

URL 中的字符集编码与乱码(上)--路径中的字符集编码

深入介绍了 URL 中的转义编码, 用具体例子讲解了中文 URL 中的转义情况, 以及 tomcat Connector 中的 URIEncoding 设置.

在之前说完了静态 html 页面的中的编码(, , , , ), 接着又谈论了动态 html 页面中的编码问题, 具体以 java 平台为例, 谈论了 , servlet 中的编码问题 以及 jsp 中的编码与乱码问题.

虽然没有涉及更多的语言平台, 比如 php, asp, 乃至 nodejs, python, ruby 等, 但背后的原理基本也是相通的.

这一次将转入一个新的话题, 就是 URL 中的编码与乱码问题.

带有中文的 URL

我们依然从一些简单的实验开始去探讨, 而不是直接给出一些结论. 先创建两个有着中文文件名的 html, 页面编码分别是 utf-8 和 gbk;以及一个中文名的文件夹, 下面再放一个普通的 html 文件, 如下所示:

中文 url 文件名 路径名

自然, 你可能听说过很多前辈们的警告: 千万别用中文作文件名或路径名(文件夹名). 这种警告应该说是中肯的, 但也不意味着用了中文就一定有问题.

前面三个文件的内容如下:

继续阅读

Java 字节流与字符流的字符集编码及乱码(3)--缺省编码

在上一篇中比较了使用字节流和字符流来读取(写入)文本文件的优劣后, 这一篇主要探讨缺省编码这个主题.

字符流使用缺省编码

通过前面的例子, 已经得出了一个结论: 字符流=字节流+编码.

可以在构建字符流时显示传入编码参数, 那么所得到的字符流就会以该编码来**编码(encode)解码(decode)**字节流, 这会给文本数据处理带来极大方便.

但有时, 构建字符流时也可以不传入编码参数, 比如如下直接构建一个 InputStreamReader :

继续阅读

Java 字节流与字符流的字符集编码及乱码(2)--读取文件

在上一篇中介绍了字节流与字符流的关系, 这一篇主要给出一些具体的代码示例.

使用字节流读取文本文件

上篇中说到, 无论是字符流还是字节流, 都可以用于读取文本文件, 特别是对于一整个文件的读取, 两者的差别并不大. 来看一个具体的示例, 假如有如下 gbk 编码的 txt 文件一枚, 具体内容为"hi你好", 对应二进制如下:

gbk 编码 hi你好

那么可以这样去读取:

继续阅读

网页中的字符集编码与乱码(5)--缺省字符集编码与语言地区设置

深入探讨了缺省情况下浏览器的响应行为, 包括静态和动态的响应, 最后, 对所有情况作了一个简单总结.

在上一篇我们谈论了 BOM 编码的页面, 并知道了它是有最高优先级的. 而这一篇将讨论最后的一个主题, 也就是缺省的情况. 既然名为缺省, 也就不难想到, 它的优先级是最低的, 也即是在其它情况下都无法确定编码时, 才轮到它上场.

缺省

前面说到, 缺省就是没有 BOM, 响应头中的 Content-Type 也没有 charset 声明, 文档内也没有 meta charset 的声明, 这时浏览器该如何确定 html 页面的编码呢? 这里将设计一系列实验以探究这个问题.

构建一个缺省响应

首先是构建一个缺省的响应. 比如去构建一个 gbk 编码的文档, 自然就没有所谓的 BOM 了;然后用 gbk 编码保存这个文档, 但在文档内也不声明;之后配置服务器的响应头也不带 charset 信息. 这样一来, 浏览器收到这个文档流时无法获得任何有效的编码信息, 就将进入缺省的处理模式.

构建一个缺省的 gbk 文档时有几点要注意. 这点在前面的"文档内编码声明"章节也已经提到过, 特别是你在一个工程缺省编码为 UTF-8 的项目内创建这样的文档时更要注意, 当你删掉 meta charset="gbk" 的声明时, 智能的 IDE 编辑器可能会悄悄调整所使用的编码.

最好是在外部用记事本或 notepad++ 这样的通用文本编辑器来创建一个缺省的 gbk 编码的文档.

继续阅读