当前位置:文档之家› 字符集编码和乱码问题总结

字符集编码和乱码问题总结

【摘要】本文档对字符、字符集、字符编码等概念进行了介绍,对常用的几种字符集进行了介绍和总结;第二个重点就是乱码问题,文档中也进行了详细细致的描述,包括乱码的定义,乱码的产生原因,解决方案等;重点解释了Java出现乱码的原因,以及对Java开发中会产生乱码的情形进行了总结,列举了解决方案。

在计算机的世界里,乱码是交流失败最常见的表现形式。作为一个计算机方面的工作者,乱码问题在我们的编程工作中会经常遇到,并且有的时候非常难以解决,非常影响编程效率,本文系统讲述了乱码产生的原因及解决办法,还有字符,字符集,字符编码的定义,帮助我们在日常编程工作中尽量避免乱码问题并且在出现问题时能够行之有效的解决。

【关键词】字符字符集乱码 Java

目录

1 引言 (5)

2 相关名词解释 (5)

2.1 字符 (5)

2.2 字符集 (5)

2.3 字符编码 (5)

2.4 码元 (6)

2.5 编码空间 (6)

2.6 抽象字符表 (6)

2.7 编码字符集 (6)

2.8 码位 (7)

2.9 字符编码表 (7)

2.10 字符映射 (7)

2.11 代码页 (7)

2.12 交换码 (7)

2.13 内码 (7)

2.14 外码 (7)

3 常见字符集介绍 (8)

3.1 ASCII (8)

3.1.1 ASCII定义 (8)

3.1.2 ASCII 简介 (8)

3.1.3 ASCII 特点 (8)

3.2 GB2312 (8)

3.2.1 GB2312定义 (8)

3.2.2 GB2312简介 (9)

3.2.3 GB2312 特点 (9)

3.3 Big5 (10)

3.3.1 Big5 定义 (10)

3.3.2 Big5 简介 (10)

3.3.3 Big5 特点 (10)

3.4 GB18030 (10)

3.4.1 GB 18030 定义 (10)

3.4.2 GB 18030 简介 (11)

3.4.3 GB 18030 特点 (11)

3.5 ISO-8859-1 (11)

3.5.1 ISO-8859-1 定义 (11)

3.5.2 ISO-8859-1 简介 (11)

3.5.3 ISO-8859-1 特点 (11)

3.6 Unicode (12)

3.6.1 Unicode 定义 (12)

3.6.2 Unicode 起源与发展 (12)

3.6.3 Unicode 特点 (13)

3.6.4 Unicode 作用及意义 (13)

3.6.5 Unicode 实现方式 (13)

4 关于字符的常见问题 (14)

4.1 字符编码与字符集的区别 (14)

4.2 汉字有ASCII码吗 (15)

4.3 UTF-16与UTF-8相比,有什么优点 (15)

4.4 GBK,GB2312和UTF-8的区别 (15)

5 乱码 (16)

5.1 乱码的定义 (16)

5.2 可能产生乱码的常见原因 (16)

5.3 Java中的乱码产生的原因 (17)

5.4 Java中乱码解决方案 (17)

5.4.1 针对直接在console上运行的类 (17)

5.4.2 针对Servlet (17)

5.4.3 JAVA程序和数据库之间 (18)

5.4.4 针对JSP代码 (18)

5.4.5 GET请求乱码 (18)

5.4.6 Ajax请求乱码 (18)

5.4.7 GET方法的另一个乱码问题 (19)

5.4.8 HTML网页乱码 (19)

5.5 如何避免乱码 (19)

1 引言

世界早已进入到了信息化时代,每天产生的信息量也在呈指数级增长,越来越多的信息在我们和电子设备之间进行交流,而如何让我们和电子设备之间更好、更准确、更方便的交流便成为了人们探究的问题。不管是我们与电子设备之间的交流还是电子设备之间的相互交流,不管其交流的方式有多少种,交流的结果只有两种:成功或者失败。交流成功指的是相互交流的双方可以很清晰地理解对方所表达的含义;而交流的失败指的是双方不能很清晰的领会对方的含义,甚至无法领会各自想表达的含义。

在计算机的世界里,乱码是交流失败最常见的表现形式。作为一个计算机方面的工作者,乱码问题在我们的编程工作中会经常遇到,并且有的时候非常难以解决,非常影响编程效率,本文系统讲述了乱码产生的原因及解决办法,还有字符,字符集,字符编码的定义,帮助我们在日常编程工作中尽量避免乱码问题并且在出现问题时能够行之有效的解决。

2 相关名词解释

2.1 字符

字符:各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数等。

2.2 字符集

字符集:也就是多个字符的集合。

2.3 字符编码

字符编码:是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。

计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。

编码(encoding)和字符集不同。字符集只是字符的集合,不一定适合作网络传送、处理,有时须经编码(encode)后才能应用。字符编码就是以二进制的数字来对应字符集的字符。因此,对字符进行编码,是信息交流的技术基础。规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。

各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。因此,平常我们所说的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。

注意:Unicode字符集有多种编码方式,如UTF-8、UTF-16等;ASCII只有一种;大多数MBCS(包括GB2312)也只有一种。

2.4 码元

码元:码元(Code Unit,也称“代码单元”)是指一个已编码的文本中具有最短的比特组合的单元。对于UTF-8来说,码元是8比特长;对于UTF-16来说,码元是16比特长;对于UTF-32来说,码元是32比特长。码值(Code Value)是过时的用法。

2.5 编码空间

编码空间:包含所有字符的表的维度。

2.6 抽象字符表

抽象字符表:是一个系统支持的所有抽象字符的集合。

2.7 编码字符集

编码字符集:是将字符集中每个字符映射到1个坐标(整数值对:x, y)或者表示为1个非负整数。字符集及码位映射称为编码字符集。

2.8 码位

码位:编码空间中的一个位置称为码位。一个字符所占用的码位称为码位值。

2.9 字符编码表

字符编码表:是将编码字符集的非负整数值(即抽象的码位)转换成有限比特长度的整型值(称为码元)的串行。

2.10 字符映射

字符映射:从字符串行到编码后的字节串行的映射。

2.11 代码页

代码页:是字符编码的别名,也称“内码表”,是特定语言的字符集的一张表。

2.12 交换码

交换码:是指用于交换文件所使用的编码。

2.13 内码

内码:是“将资讯编码后,透过某种方式储存在特定记忆装置时,装置内部的编码形式”。在不同的系统中,会有不同的内码。

2.14 外码

外码:是相对于内码而言的词汇。在计算机科学及相关领域中,外码指的是“外在的‘经过学习之后,可直接了解的编码形式(例如:文字或语音符号)’”。

3 常见字符集介绍

3.1 ASCII

3.1.1 ASCII定义

定义:ASCII是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。

3.1.2 ASCII 简介

简介:ASCII 码使用指定的 7 位或 8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符。

3.1.3 ASCII 特点

特点:ASCII是美国标准,所以它不能良好满足其它讲英语国家的需要。基础码有128个码,扩展后也只有256个,无法满足某些国家文字中字符较多的问题,或者某些国家的特殊符号也不包含在ASCII码内,造成交流问题。例如英国的英镑符号(£),拉丁语字母表重音符号,使用斯拉夫字母表的希腊语、希伯来语、阿拉伯语和俄语,汉字系统的中国象形汉字,日本和朝鲜的文字等等,这些在ASCII码中都没有对应码值。

3.2 GB2312

3.2.1 GB2312定义

定义:信息交换用汉字编码字符集。《信息交换用汉字编码字符集》是由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是GB 2312—1980。

3.2.2 GB2312简介

简介:GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。

基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。

把换算成十六进制的区位码加上2020H,就得到国标码。国标码加上

8080H,就得到常用的计算机机内码。1995年又颁布了《汉字编码扩展规范》(GBK)。GBK与GB 2312—1980国家标准所对应的内码标准兼容,同时在字汇一级支持ISO/IEC10646—1和GB 13000—1的全部中、日、韩(CJK)汉字,共计20902字。

3.2.3 GB2312 特点

特点:GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。

01-09区为特殊符号。

16-55区为一级汉字,按拼音排序。

56-87区为二级汉字,按部首/笔画排序。

10-15区及88-94区则未有编码。

每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”(也称“区字节)”,第二个字节称为“低位字节”(也称“位字节”)。

这就是汉子的国标码,专门用来表示汉字,是双字节编码,而英文字母和ISO-8859-1一致(兼容ISO-8859-1编码)。其中GBK编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,GBK是兼容gb2312编码的。GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1 国际标准,是前者向后者过渡过程中的一个承上启下的标准。

3.3 Big5

3.3.1 Big5 定义

定义:BIG-5码是通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。地区标准号为:CNS11643,这就是人们讲的BIG-5码。

3.3.2 Big5 简介

简介:大五码(Big5),又称为五大码,是使用繁体中文社群中最常用的电脑汉字字符集标准,共收录13,060个中文字,其中有二字为重覆编码,Big5属中文内码(中文码分为中文内码及中文交换码两类)。Big5虽普及于中国的台湾、香港与澳门等繁体中文通行区,但长期以来并非当地的国家标准,而只是业界标准(de facto standard)。倚天中文系统、Windows等主要系统的字符集都是以Big5为基准,但厂商又各自增删,衍生成多种不同版本。2003年,

Big5被收录到台湾官方标准的附录当中,取得了较正式的地位。这个最新版本被称为Big5-2003。

3.3.3 Big5 特点

特点:Big5码是一套双字节字符集,使用了双八码储存方法,以两个字节来安放一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。“高位字节”使用了0x81-0xFE,“低位字节”使用了0x40-0x7E,及

0xA1-0xFE。

3.4 GB18030

3.4.1 GB 18030 定义

定义:国家标准GB18030-2000《信息交换用汉字编码字符集基本集的补充》是我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准,是我国计算机系统必须遵循的基础性标准之一。

3.4.2 GB 18030 简介

简介:GB18030-2000编码标准是由信息产业部和国家质量技术监督局在2000年 3月17日联合发布的,并且将作为一项国家标准在2001年的1月正式强制执行。GB18030-2005《信息技术中文编码字符集》是我国自主研制的以汉字为主并包含多种我国少数民族文字(如藏、蒙古、傣、彝、朝鲜、维吾尔文等)的超大型中文编码字符集强制性标准,其中收入汉字70000余个。

3.4.3 GB 18030 特点

特点:GB18030可用于一切处理中文(包括汉字和少数民族文)信息,特别是汉字信息的信息处理产品。GB18030-2005标准可应用于中文处理的软件类产品,如操作系统、数据库、中间件、办公软件、财务软件、CAD软件、表处理

软件、教育软件、字型字库等。GB18030-2005标准还可应用于具有处理汉字功能的硬件产品,如打印机、移动电话、PDA产品等。

3.5 ISO-8859-1

3.5.1 ISO-8859-1 定义

定义:正式编号为ISO/IEC 8859-1:1998,又称Latin-1或“西欧语言”,是国际标准化组织内ISO/IEC 8859的第一个8位字符集。

3.5.2 ISO-8859-1 简介

简介:它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入96个字母及符号,藉以供使用附加符号的拉丁字母语言使用。

3.5.3 ISO-8859-1 特点

特点:此字符集支持部分于欧洲使用的语言,包括阿尔巴尼亚语、巴斯克语、布列塔尼语、加泰罗尼亚语、丹麦语、荷兰语、法罗语、弗里西语、加利西亚语、德语、格陵兰语、冰岛语、爱尔兰盖尔语、意大利语、拉丁语、卢森堡语、挪威语、葡萄牙语、里托罗曼斯语、苏格兰盖尔语、西班牙语及瑞典语。

3.6 Unicode

3.6.1 Unicode 定义

定义:Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。

3.6.2 Unicode 起源与发展

起源与发展:Unicode 是为了解决传统的字符编码方案的局限而产生的,例如ISO 8859所定义的字符虽然在不同的国家中广泛地使用,可是在不同国家间却经常出现不兼容的情况。很多传统的编码方式都有一个共同的问题,即容许电脑处理双语环境(通常使用拉丁字母以及其本地语言),但却无法同时支持多语言环境(指可同时处理多种语言混合的情况)。

Unicode 编码包含了不同写法的字,如“ɑ/a”、“户/户/戸”。然而在汉字方面引起了一字多形的认定争议(详见中日韩统一表意文字主题)。

在文字处理方面,统一码为每一个字符而非字形定义唯一的代码(即一个整数)。换句话说,统一码以一种抽象的方式(即数字)来处理字符,并将视觉上的演绎工作(例如字体大小、外观形状、字体形态、文体等)留给其他软件来处理,例如网页浏览器或是文字处理器。

几乎所有电脑系统都支持基本拉丁字母,并各自支持不同的其他编码方式。Unicode为了和它们相互兼容,其首 256字符保留给ISO 8859-1所定义的字符,使既有的西欧语系文字的转换不需特别考量;并且把大量相同的字符重复编到不同的字符码中去,使得旧有纷杂的编码方式得以和 Unicode编码间互相直接转换,而不会丢失任何信息。举例来说,全角格式区段包含了主要的拉丁字母的全角格式,在中文、日文、以及韩文字形当中,这些字符以全角的方式来呈现,而不以常见的半角形式显示,这对竖排文字和等宽排列文字有重要作用。

在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。在基本多文种平面(英文为 Basic Multilingual Plane,简写 BMP。它又简称为“零号平面”, plane 0)里的所有字符,要用四位十六进制数(例如U+4AE0,共支持六万多个字符);在零号平面以外的字符

则需要使用五位或六位十六进制数了。旧版的 Unicode标准使用相近的标记方法,但却有些微的差异:在Unicode 3.0里使用“U-”然后紧接着八位数,而“U+”则必须随后紧接着四位数。

3.6.3 Unicode 特点

特点:Unicode伴随着通用字符集的标准而发展,同时也以书本的形式[1]对外发表。Unicode至今仍在不断增修,每个新版本都加入更多新的字符。目前最新的版本为第六版,已收入了超过十万个字符(第十万个字符在2005年获采纳)。Unicode涵盖的数据除了视觉上的字形、编码方法、标准的字符编码外,还包含了字符特性,如大小写字母。

Unicode发展由非营利机构统一码联盟负责,该机构致力于让Unicode方案取代既有的字符编码方案。因为既有的方案往往空间非常有限,亦不适用于多语环境。

3.6.4 Unicode 作用及意义

作用与意义:能够使计算机实现跨语言、跨平台的文本转换及处理。Unicode 编码系统,可分为编码方式和实现方式两个层次。Unicode备受认可,并广泛地应用于计算机软件的国际化与本地化过程。有很多新科技,如可扩展置标语言、Java编程语言以及现代的操作系统,都采用Unicode编码。

3.6.5 Unicode 实现方式

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、

UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。

通用字符集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。UCS-2用两个字节编码,UCS-4用4个字节编码。

历史上存在两个独立的尝试创立单一字符集的组织,即国际标准化组织(ISO)和多语言软件制造商组成的统一码联盟。前者开发的 ISO/IEC 10646 项目,后者开发的统一码项目。因此最初制定了不同的标准。

UTF-8:以字节为单位对Unicode进行编码。UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。

UTF-16:编码以16位无符号整数为单位。UTF-16就是UCS-2加上附加字符的支持,也就是符合unicode4.0规范的UCS-2。所以UTF-16是UCS-2的严格超集。UTF-16中的字符,要么是2个字节,要么是4个字节表示的。UTF-16主要在windows2000以上版本使用。

UTF-32:编码以32位无符号整数为单位。Unicode的UTF-32编码就是其对应的32位无符号整数。

4 关于字符的常见问题

4.1 字符编码与字符集的区别

字符集只是指定了一个集合中有哪些字符,而字符编码,是为这个集合中所有字符定义个编号,这就是字符集与编码区别所在。如下图:

计算机中只保存该字符在某字符集中对应的字符编号(也叫字符编码)。

4.2 汉字有ASCII码吗

ASCII是标准国际编码,只有256个字符,没有汉字,所以表示不了汉字。收录有汉字的字符集有GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。

4.3 UTF-16与UTF-8相比,有什么优点

(1)对于亚洲字符的存储空间需求比UTF-8少,因为每个字符都是2个字节。(2)处理字符的速度比UTF-8更快,因为是固定长度编码的。(3)对于windows和Java的支持更好。

4.4 GBK,GB2312和UTF-8的区别

首先,我们要明白,GB2312、GBK和UTF-8都是一种字符编码,除此之外,还有好多字符编码。只是对于我们中国人的网站来说,用这三种编码比较多。简单的说一下,为什么要用编码,在计算机内,储存文本信息用ASC II码,每一个字符对应着唯一的ASCII码。最初计算机是由美国发明的,他们也用的是键

盘和上面的字母,所以他们的字符ASCII好解决。但是我们中国的就不同了,每个汉字要对应唯一的ASCII码。这样,就出来了国家制定的字符编码标准:GB2312、GBK等。其他国家,其他语言也有他们对应的编码标准。 GB 就是国标的意思,GB2312和GBK主要用于汉字的编码,而UTF-8是全世界通用的。意思就是说,如果你的网页主要面对使用汉语的中国人的话,使用 GB2312和GBK 非常好,文字储存体积要小,有一些优点。如果你的网页要面向世界的话,你再用GB2312和GBK作为网页编码的话,有些电脑上的浏览器没有这种编码,你的网页汉字内容就会变成无法识别的乱码。

5 乱码

5.1 乱码的定义

定义:乱码指的是计算机系统不能显示正确的字符,而显示其他无意义的字符或空白,如一堆ASCII代码。这样所显示出来的文字统称为乱码。

5.2 可能产生乱码的常见原因

1.一般是软件程序解码错误。如浏览器把GBK码当成是Big5码显示,或电子邮件程序把对方传来的邮件错误解码。如果在发送时编码错误,收件者的电邮程序是不能解码的,需要寄件者的电邮程序重新编码再寄。

2.字体文件(font file)不对。

3.来源编码错误,或文件受到破坏。

4.一种语言版本的操作系统安装了另外一种语言版本的应用程序,或者应用程序安装的补丁的语言版本与应用程序原来安装的语言版本不一致。

5.早期单字节的应用程序在打开双字节语言的文件时不能正确识别文字的分区,在换行的地方把一个字从中分成两段,导致紧接在后面的整个一行全部都是乱码。

6.低版本的应用程序不能识别高版本的程序创建的文件。

5.3 Java中的乱码产生的原因

随着计算机的发展,为了适应世界其它民族的语言(当然包括我们的汉字),人们提出了UNICODE 编码,由于 Java 语言内部采用UNICODE 编码,所以在JAVA 程序运行时,就存在着一个从UNICODE 编码和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题,这个转换过程有着一系列的步骤,如果其中任何一步出错,则显示出来的汉字就会出是乱码,这就是我们常见的JAVA 中文问题。

例: gb2312字符集中编号是:54992或者是D6D0 ,无论那个程序都知道是”中”,如果有人听错了,把它弄成日文JIS字符集,然后他也去找编号是:54992对应的字符,却找到的是:”面“。同样如果把54992拿到Ascii 码表找,就会得到对应:??两个不能打印字符了。

当你拿到本来是gb2312编号,在不是它的字符集里面找就会出现乱码问题。

从上述可知:由于存在着多种不同的字符集,在各种字符集之间进行转换,就有可能出现乱码,同样是中文字符集GB2312和GBK,由于编码范围的不同,某些字符在转换时也会出现乱码。

5.4 Java中乱码解决方案

5.4.1 针对直接在console上运行的类

对于这种情况,我们建议在程序编写时,如果需要从用户端接收用户的可能含有中文的输入或含有中文的输出,程序中应该采用字符流来处理输入和输出

如:BufferedReader stdin = new BufferedReader (new

InputStreamReader(System.in,"UTF-8"));

5.4.2 针对Servlet

在编译Servlet类的源程序时,用-encoding指定编码为UTF-8,且在向用户输出时的编码部分用response对象的

setContentType("text/html;charset=UTF-8")来设置输出编码格式;同样在接收用户输入时,我们用request.setCharacterEncoding("UTF-8");为了避免

每个servlet都需要写这些相同的代码可在filter中设置。

5.4.3 JAVA程序和数据库之间

为避免JAVA程序和数据库之间数据传递出现乱码现象,我们建议采用以下最优方法来处理:

1、对于JAVA程序的处理方法按我们指定的方法处理。

2、把数据库默认支持的编码格式改为UTF-8的。

5.4.4 针对JSP代码

运行时,由WEB容器进行动态编译的,他在移植时最容易出问题,那是因为容器在编译JSP文件时获取的操作系统的编码不同造成的,解决办法如下:

1、我们要保证JSP向客户端输出时是采用中文编码方式输出的,即无论如何我们首先在我们的JSP源代编中加入以下一行:

<%@page contentType="text/html; charset=UTF-8"%>

2、为了让JSP能正确获得传入的参数,我们在JSP源文件头加入下面一句:<%request.setCharacterEncoding("UTF-8");%>

3、为了让JSP编译器能正确地解码我们的含有中文字符的JSP文件,我们需要在JSP源文件中指定我们的JSP源文件的编码格式,具体来说,我们在JSP 源文件头上加入下面的一句即可: <%@page pageEncoding=" UTF-8"%>

5.4.5 GET请求乱码

如果在本项目中采用了get方式提交请求并附加参数,结果导致编码乱码,原因是Tomcat默认请求编码是ISO8859,需要在Tomcat的配置文件 server.xml 添加一个参数,URIEncoding=”UTF-8”,这样请求中附件的参数就会以UTF-8

来进行编码。

5.4.6 Ajax请求乱码

使用Ajax,JS也是默认使用ISO8859编码,所以在进行请求时遇到中文参数需要进行编码,如:var url =

"GetSelectListAction.do?queryData=subTrade" + "&queryId=" + encodeURI(obj.value) + "&r=" + Math.random();

有两个地方需要注意:第一个地方是encodeURI(),方法,可以将参数进行

转码,默认是转化为UTF-8,如果需要转为其他码制,需要在方法中添加第二

个参数。

第二个地方是Math.random(),由于Ajax有缓存机制,在接受请求的时候第一时间先判断该请求的地址是否被访问过,如果被访问过则直接使用缓存中的内容返回,这个东西很讨厌,客户在访问过一次出错后以后每次出现的都是这个错误,所以在请求中给其增加一个时间戳,只要可以随机生成一个不同的字串就可以,保证Ajax每次都去访问服务器。

5.4.7 GET方法的另一个乱码问题

在项目即将交工的时候突然又出现乱码问题,发现对于超长的汉字作为参数传递仍然会出现乱码问题,解决方法是采用https://www.doczj.com/doc/739309586.html,.URLEncoder的 Encode 方法强制转码,写法如:

5.4.8 HTML网页乱码

在HTML网页的中存在多个标签,其中可以设置Content-Type。例如:

5.5 如何避免乱码

1.尽量使用统一的编码,如果你是重头开发一个系统,特别是Java开发的,推荐从页面到数据库再到配置文件都使用UTF-8进行编码,安全第一。

2.SetCharacterEncodingFilter的使用,这个东西不是万能的,但是没有它就会很麻烦,,这个Filter只是对POST请求有效,GET一律忽略。

3.就如上面所说,GET请求有问题,尽量使用POST请求。

4.JavaScript和Ajax乱码的避免,注意JavaScript默认是ISO8859的编码,避免JS/AJAX乱码和GET一样,不要在URL里面使用中文,实在避免不了,就只能在生成链接的时候转码。

5.尽早统一开发环境,早点模拟真实环境测试。

相关主题
文本预览
相关文档 最新文档