JSP 中的字符集编码与乱码问题

深入介绍了 JSP 中的编码与乱码问题, 分析对比了 page 指令中的 pageEncoding 属性和 contentType 属性, 还对 JSP 与 servlet 及 HTML 的关系作了一个简要介绍.

在说完了网页中的编码与乱码(, , , , ), servlet 中的编码问题 后, 这次来探讨一下 JSP 中的编码与乱码问题.

在之前, 曾谈到过 JSP 与 HTML 间的关系, JSP 本质上是一个 HTML 的模板, 用于在服务端动态生成 HTML, 这点跟 servlet 是类似.

其实 JSP 本质就是 servlet, 一个 JSP 页面它会被编译成一个 java 文件, 实际上就是一个 servlet 类(或其子类, 在文章的后面会具体讨论这个问题).

继续阅读

Java servlet 使用 PrintWriter 时的字符集编码与乱码

介绍了 Java servlet 使用 PrintWriter 时的编码与乱码问题, 并探讨了 PrintWriter 的缺省编码与普通字符流的缺省编码的差异.

在前面的网页中的编码与乱码系列中(, , , , ), 曾多次提到使用 servlet 方式构建的动态响应流, 不过在那里都是直接使用字节流的方式, 不过, 更为常见的方式是使用字符流. 而在前面, 又谈到了 Java 字节流与字符流的话题(, , , ).

有了前面的基础, 现在来说下 Java servlet 中使用字符流, 也即是 PrintWriter 时的编码与乱码问题.

回顾字节流的情形

先回顾一下, 在之前的字节流响应中, 我们使用 String.getBytes 方法, 然后总是显式传入编码的参数, 使它与 meta 中或者 header 的声明一致. 比如这样:

继续阅读

Java 字节流与字符流的字符集编码及乱码(4)--字符

怎样算是"一个字符"?

在这一篇, 我们谈论最后一个话题, 就是"到底怎样才算一个‘字符’"?

其实这个话题在 字符集与编码(五)--代码单元及 length 方法 中和 文本在内存中的编码(1)--乱码探源(4) 也有所涉及, 这里结合字符流的话题再综合深入探讨它一下, 并且还将涉及一个 unicode 组合字符及正规化的话题. (这在前面也没有涉及过的)

怎样算是一个字符?

初看起来, 这是个很 naive 的问题. 以前面经常举的例子来说:

"h" 是一个字符;

"i" 是一个字符;

"你" 是一个字符;

"好" 也是一个字符.

继续阅读

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

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

字符流使用缺省编码

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

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

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

继续阅读

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

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

使用字节流读取文本文件

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

gbk 编码 hi你好

那么可以这样去读取:

继续阅读