Servlet 中文乱码问题及解决方案剖析
分类: 【Java Web】2012-01-28 23:26258 人阅读评论(0)收藏举报
一、 常识了解
一、什么是字符集?什么是编码?
字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。 一组抽象字符的集合就是字符集(Charset)。 字符集常常和一种具体的语言文字对应起来, 该文字中的所有字符或者大部分常用字符就构 成了该文字的字符集,比如英文字符集。 一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。 字符集的子集也是字符集。
计算机要处理各种字符, 就需要将字符和二进制内码对应起来, 这种对应关系就是字符编码 (Encoding)。 制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据 字符集内字符的多少,会确定用几个字节来编码。 每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set), 这是字符集的另外一个含义。通常所说的字符集大多是这个含义。
二、有哪些字符集?
ASCII: American Standard Code for Information Interchange,美国信息交换标准码。 目前计算机中用得最广泛的字符集及其编码,由美国国家标准局(ANSI)制定。 它已被国际标准化组织(ISO)定为国际标准,称为 ISO 646 标准。 ASCII 字符集由控制字符和图形字符组成。 在计算机的存储单元中,一个 ASCII 码值占一个字节(8 个二进制位),其最高位(b7)用作奇 偶校验位。 所谓奇偶校验, 是指在代码传送过程中用来检验是否出现错误的一种方法, 一般分奇校验和 偶校验两种。 奇校验规定:正确的代码一个字节中 1 的个数必须是奇数,若非奇数,则在最高位 b7 添 1。 偶校验规定:正确的代码一个字节中 1 的个数必须是偶数,若非偶数,则在最高位 b7 添 1。
ISO 8859-1: ISO 8859,全称 ISO/IEC 8859,是国际标准化组织(ISO)及国际
电工委员会(IEC)联合制定 的一系列 8 位字符集的标准,现时定义了 15 个字符集。 ASCII 收录了空格及 94 个“可印刷字符”,足以给英语使用。 但是,其他使用拉丁字母的语言(主要是欧洲国家的语言),都有一定数量的变音字母,故可 以使用 ASCII 及控制字符以外的区域来储存及表示。 除了使用拉丁字母的语言外,使用西里尔字母的东欧语言、希腊语、泰语、现代阿拉伯语、 希伯来语等,都可以使用这个形式来储存及表示。 * ISO 8859-1 (Latin-1) - 西欧语言 * ISO 8859-2 (Latin-2) - 中欧语言 * ISO 8859-3 (Latin-3) - 南欧语言。世界语也可用此字符集显示。 * ISO 8859-4 (Latin-4) - 北欧语言 * ISO 8859-5 (Cyrillic) - 斯拉夫语言 * ISO 8859-6 (Arabic) - 阿拉伯语 * ISO 8859-7 (Greek) - 希
腊语 * ISO 8859-8 (Hebrew) - 希伯来语(视觉顺序) * ISO 8859-8-I - 希伯来语(逻辑顺序) * ISO 8859-9 (Latin-5 或 Turkish) - 它把 Latin-1 的冰岛语字母换走,加入土耳其语字 母。 * ISO 8859-10 (Latin-6 或 Nordic) - 北日耳曼语支,用来代替 Latin-4。 * ISO 8859-11 (Thai) - 泰语,从泰国的 TIS620 标准字集演化而来。 * ISO 8859-13 (Latin-7 或 Baltic Rim) - 波罗的语族 * ISO 8859-14 (Latin-8 或 Celtic) - 凯尔特语族 * ISO 8859-15 (Latin-9) - 西欧语言,加入 Latin-1 欠缺的法语及芬兰语重音字母,以及 欧元符号。 * ISO 8859-16 (Latin-10) - 东南欧语言。主要供罗马尼亚语使用,并加入欧元符号。 很明显,iso8859-1 编码表示的字符范围很窄,无法表示中文字符。 但是,由于是单字节编码,和
计算机最基础的表示单位一致,所以很多时候,仍旧使用 iso8859-1 编码来表示。 而且在很多协议上,默认使用该编码。
UCS: 通用字符集(Universal Character Set,UCS)是由 ISO 制定的 ISO 10646(或称 ISO/IEC 10646)标准所定义的字符编码方式,采用 4 字节编码。
UCS 包含了已知语言的所有字符。 除了拉丁