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

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

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

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

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

继续阅读“JSP 中的字符集编码与乱码问题”

Java servlet 使用 PrintWriter 时的编码与乱码

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

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

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

继续阅读“Java servlet 使用 PrintWriter 时的编码与乱码”

Java 字节流与字符流(4)

怎样算是“一个字符”?

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

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

继续阅读“Java 字节流与字符流(4)”

Java 字节流与字符流(1)

Java 的 IO 系统是比较庞杂的,各种流特别多,其中有一种就是字符流。

在本系列前面的一些文章中,也曾涉及过字符流的话题,不过没有详细展开讨论,这次准备具体综合地谈一谈。

你可能听过不少关于字节流与字符流对比的介绍,不过严格地说,我认为把“字节流”和“字符流”去对比这种说法不是特别妥当,为什么呢?

继续阅读“Java 字节流与字符流(1)”

非 BMP 字符判断及判断字符串中是否包含非 BMP 字符

判断一个字符是 BMP 字符还是非 BMP 字符(增补字符),以及判断字符串中是否包含非 BMP 字符。

在 Java 中,要判断一个字符是否为增补字符,也即所谓的非 BMP 字符,可以综合使用 String 类中的 codePointAt 和 Character 类中的 isSupplementaryCodePoint 方法,具体如下:
继续阅读“非 BMP 字符判断及判断字符串中是否包含非 BMP 字符”

Java 语言中一个字符占几个字节?

一个字符占几个字节?很多人喜欢问这个问题,遗憾的是他们没有意识到这其实是一个糟糕的问题,因为它缺乏了必要的前提……

这是一个来自知乎上的问题,https://www.zhihu.com/question/27562173,提问者问:

Java中理论说是一个字符(汉字 字母)占用两个字节。
但是在UTF-8的时候 new String(“字”).getBytes().length 返回的是3 表示3个字节

小白求回答。。

继续阅读“Java 语言中一个字符占几个字节?”

Java 大法好,GC 保平安——关于性能权衡(tradeoff)的一些思考

Java 之父 James Gosling 在一次接受采访谈到 C 语言时说:C 语言的一个大问题之一是“一切都会尖叫着停止”,”Everything comes to a screeching halt” is one of the big issues in C, because of the way that they do pointers……

语言的鄙视链是一直存在的,有人会以自己使用的语言更灵活,更底层,效率更高而自豪乃至鄙视其它一些语言的使用者,比如 C 语言的使用者可能看不上 Java 语言的使用者。Java 之父有一次谈到了 Java 与 C 语言的对比,他是怎么说的呢? 继续阅读“Java 大法好,GC 保平安——关于性能权衡(tradeoff)的一些思考”

Java 线程状态之 BLOCKED

摘要:深入探讨了 Java 线程的 BLOCKED 状态,特别是对 enter 及 reenter 两种情形进行了深入分析。

上一篇章中,我们强调了 BLOCKED 状态跟 I/O 的阻塞是不同的,它不是一般意义上的阻塞,而是特指被 synchronized 块阻塞,即是跟线程同步有关的一个状态。

继续阅读“Java 线程状态之 BLOCKED”

Java 线程状态之 RUNNABLE

摘要:深入探讨了 Java 线程的 RUNNABLE 状态,特别是对处在 IO 阻塞时的状态进行了深入分析。

上一篇我们粗略谈到了 Java 的 6 种线程状态,并对其中较为简单的 NEW 和 TERMINATED 做了分析,现在我们具体来看下 State.RUNNABLE 状态,即所谓的可运行状态。(以下简称 runnable)

继续阅读“Java 线程状态之 RUNNABLE”