Java中的中文字符编码问题

基本概念

为什么要编码?

  只要你了解过或学过计算机,那你肯定非常清楚现在的计算机里头处理的就是二进制数据,就是一堆0和1,更具体来说就是一堆数字。但是计算机只能表示数字给我们看用处少了点,我们人肯定是想看到计算机可以处理以及表示我们所使用的各种语言文字啊,但计算机肯定是不能直接懂我们所用的文字,它只懂数字。
  所以要通过间接的手段来解决这个问题,解决方案就是我们人自己制定一套编码规则,思路很简单:创建存储一套字符集,给字符集内的每个字符都指定一个数字编号。当然,实际情况当然要比这个复杂得多,但这是最通俗的思路。这样,通过这些编号,人与计算机的交互,对于人来说就更方便更人性化了。通俗类比来说正如给一个书的每一页都指定一个数字编号,我们称它为页码,现在我们人给计算机中所存储的字符集的字符都指定一个数字编号,我们称它为字符编码(character encoding)
  综上所述:人需要计算机“懂”人所用的自然语言文字,方便我们人与计算机进行交互,那就必须给存储于计算机中的自然语言的每个文字都编个号。

字符集与字符编码的区别

一般概念上来说:

  • 字符集(character set/charset)指的是

常用的字符集以及字符编码

既然现在了解到为何要编码,那现在就来看看已经存在并且被广泛使用的字符集以及字符编码吧。

Java Web中的编码问题

请求参数

我们平时最常用的就是通过GETPOST方式来提交请求参数,解决这两者所引发的编码问题的手段是有所不同的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Connector extends LifecycleMBeanBase  {
private Charset uriCharset = StandardCharsets.UTF_8;

protected boolean useBodyEncodingForURI = false;

public Connector(String protocol) {
if (Globals.STRICT_SERVLET_COMPLIANCE) {
uriCharset = StandardCharsets.ISO_8859_1;
} else {
uriCharset = StandardCharsets.UTF_8;
}
}

/**
* @return the name of character encoding to be used for the URI using the
* original case.
*/
public String getURIEncoding() {
return uriCharset.name();
}

/**
* @return the true if the entity body encoding should be used for the URI.
*/
public boolean getUseBodyEncodingForURI() {
return this.useBodyEncodingForURI;
}

/**
* Set if the entity body encoding should be used for the URI.
*
* @param useBodyEncodingForURI The new value for the flag.
*/
public void setUseBodyEncodingForURI(boolean useBodyEncodingForURI) {
this.useBodyEncodingForURI = useBodyEncodingForURI;
setProperty("useBodyEncodingForURI", String.valueOf(useBodyEncodingForURI));
}
}

参考资料

  1. 字符集和字符编码(Charset & Encoding)
  2. 深入分析 Java 中的中文编码问题
  3. 十分钟搞清字符集和字符编码
  4. What’s the difference between an “encoding,” a “character set,” and a “code page”?
  5. What’s the difference between encoding and charset?
  6. Character encoding

其中第二这篇文章可谓是把编码问题分析得极为透彻了,而我这篇文章只不过是我自己为了自己记得清楚做个阅读笔记而已: