




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java支持UTF-8、ISO-8859-1、GBK等各种字体编码,可笔者发现Java中字体编码的问题仍难倒了不少程序员,网上虽然也有不少关于在Java中如何正确显示中文的文章,但都不够全面,笔者特意总结如下。影响Java中字体编码正确显示的有几个因素: 1)数据库的连接方式; 2)网页中使用的字体编码; 3)数据库里存放数据的字体编码; 4)Java的缺省字体编码。如果在编程中遇到不能正确显示中文时,要先弄清楚以上几项所使用的字体编码,再分析找出原因,即可解决问题。众所周知,JSP是Java的一种,和网页有关,而网页也有自己的中文编码系统,所以JSP处理中文要比纯Java的类文件更为麻烦。本文的测试数据库是MySQL3.2,数据库连接驱动是用org.gjt.mm.mysql.Driver,这里主要讨论UTF-8和GBK的显示( GB2312是GBK的一个子集,Java中可以使用GBK来代替GB系列)。我们先来研究JSP中字体编码问题,下面第一到第六点是针对JSP的(因为从数据库里读出中文数据与写入中文数据有所区别,咱们分别说明,前三点是从读取数据库到显示在网页,后三点是从网页输入数据到存入数据库),第七到第九点针对纯Java的类文件。以下rs表示ResultSet的一个实例,是执行Select语句之后产生的数据集。一、数据库连接方式使用UTF-8在连接数据库的驱动后面加上这句参数useUnicode=true&characterEncoding=UTF-8,例如jdbc:mysql:/localhost/DBVF?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8,从数据库里读出中文显示在使用GBK的JSP的网页里,如果数据库里存放的字体编码是UTF-8,在JSP中使用 str=new String(rs.getBytes(1),UTF-8)或者str=rs.getString(1),可以正确显示中文。如果数据库里存放的是 GBK数据,那么JSP中也要使用str=new String(rs.getBytes(1),GBK)来显示正确的中文。值得注意的是如果页面使用UTF-8,数据库里存放的是UTF-8,也可以用str=new String(rs.getBytes(1),GBK)正确显示中文。如果网页是UTF-8,而数据库里存放的是GBK,无法直接显示中文,需要2步转换, str=new String(rs.getBytes(1),GBK); 再str=new String(str.getBytes(UTF-8),GBK),才可以正确显示中文。二、数据库连接方式使用GBK在连接数据库的驱动后面加上这句参数useUnicode=true&characterEncoding=GBK,例如jdbc:mysql:/localhost/DBVF?autoReconnect=true&UseUnicode=true&characterEncoding=GBK,从数据库里读出中文,显示在使用GBK的JSP的网页里,如果数据库里存放的字体编码是 UTF-8,在JSP中一定要使用 str=new String(rs.getBytes(1),UTF-8),才正确显示中文。如果数据库里存放的是GBK数据,那么JSP中也要使用str=new String(rs.getBytes(1),GBK) 或者直接使用str=rs.getString(1),即可显示正确的中文。如果网页是UTF-8,而数据库里存放的是GBK,只能用str=new String(rs.getString(1).getBytes(UTF-8),GBK)的方法来显示中文; 如果网页是UTF-8,而数据库里存放的是UTF-8,可用str=new String(rs.getBytes(1),GBK) 或者rs.getString(1)方法来显示中文。三、使用缺省数据库连接方式连接数据库的驱动后面没有这句参数useUnicode=&characterEncoding=,例如 jdbc:mysql:/localhost/DBVF?autoReconnect=true,没有参数useUnicode=true& characterEncoding,表示使用默认的ISO-8895-1编码。1. 从数据库里读出中文,显示在GBK的网页里。如果数据库里存放的字体编码是UTF-8,在JSP网页中一定要使用语句 str=new String(rs.getBytes(1),UTF-8) 或者str= new String(rs.getString(1).getBytes(ISO-8859-1),UTF-8),才可正确显示中文。如果数据库里存放的是GBK数据,那么JSP中也要使用str=new String(rs.getBytes(1),GBK)或str=new String(rs.getString(1).getBytes(ISO-8859-1),GBK) 显示正确的中文。2. 如果网页是UTF-8,不能直接正确显示GBK,需要2步转换,str=new String(rs.getBytes(1),GBK),再str=new String(str.getBytes(UTF-8),GBK) 才可以正确显示中文。如果数据库里存的是UTF-8,直接用str=new String(rs.getBytes(1),GBK)或者str=new String(rs.getString(1).getBytes(ISO-8859-1),GBK)就可以显示中文了。以上是读取数据库里中文正确显示在网页上,下面三点是如何正确存入数据库。四、数据库连接方式使用UTF-8编码JSP中要把网页输入的中文存入数据库,通常有一个提交(Submit)的过程,是用 str=request.getParameter(username),然后执行update或者insert语句来存入数据库。如何赋值给str 很重要,而且这里中文输入与网页所使用的字体编码有关。1、 网页使用UTF-8,使用str= new String(request.getParameter(username).getBytes(ISO-8859-1),UTF-8)或者str= new String(request.getParameter(username).getBytes(),UTF-8),都可以使得存到数据库里的数据是UTF-8编码。2. 网页使用GBK,使用str= new String(request.getParameter(username).getBytes(),GBK),那么存入数据库的是UTF-8编码。3. 值得注意的是使用UTF-8的数据库连接方式不能存得GBK。五、数据库连接方式使用GBK编码1. 输入使用GBK网页,存到数据库里是GBK的方法: str= new String(request.getParameter(username).getBytes(ISO-8859-1),GBK) 或者str= new String(request.getParameter(username).getBytes(),GBK)。2. 网页使用GBK,想存入UTF-8到数据库里,要分2步: 先str=new String(request.getParameter(username).getBytes(),GBK),再str=new String(str.getBytes(UTF-8),GBK)即可。3. 网页使用UTF-8,而且使用str= new String(request.getParameter(username).getBytes(ISO-8859-1),GBK) 或者str= new String(request.getParameter(username).getBytes(),UTF-8),那么存到数据库里的数据是 UTF-8编码。4. 网页使用UTF-8,而且使用str= new String(request.getParameter(username).getBytes(ISO-8859-1),UTF-8),那么存到数据库里的数据是GBK编码。六、数据库连接方式使用缺省,即不使用参数useUnicode和characterEncoding1. 网页使用GBK,如果使用str= request.getParameter(username)或者str= new String(request.getParameter(username).getBytes(),那么在数据库里的数据是GBK码。网页使用 UTF-8 和使用str= request.getParameter(username),则存入数据库是UTF-8编码。2. 如果使用str= new String(request.getParameter(username).getBytes(ISO-8859-1),那么根据网页提供的字体编码而存到数据库里,比如是UTF-8的网页,那么存到数据库中就是UTF-8编码,如果使用GBK网页,那么存到数据库里的字就是GBK编码。3. 如果使用str= new String(request.getParameter(username).getBytes(UTF-8),UTF-8)这一种组合能存到正确的数据外,其他存到数据库里的数据则都是乱码或者错误码。在这个UTF-8组合的特例中,网页使用的是GBK,则存放到数据库里就是GBK,网页使用UTF-8,那么存到数据库里的就是UTF-8。4. 网页是GBK的要存得UTF-8,一定需要2步: company=new String(request.getParameter(company).getBytes(),GBK)和company=new String(company.getBytes(UTF-8)。5. 网页是UTF-8的,不能存得GBK在数据库里,一句话,改变数据库连接方式不能存得GBK码。以上所有的都是基于JSP网页和数据库交换数据,下面讨论一下纯JAVA编程下的字体编码转换。七、数据库连接方式使用UTF-8编码1. 数据库里的中文是UTF-8,可以转换为GBK,但不能把GBK存入数据库。2. 数据库是GBK,如果转换为UTF-8,使用content=new String(rs.getBytes(2),GBK)直接将content存入数据库就可为UTF-8。八、数据库连接方式使用GBK编码1. 数据库里的中文是UTF-8,如果转换为GBK,使用content= new String(rs.getString(2).getBytes(),UTF-8),再直接使用update或者insert语句插入到数据库,即存得GBK。如果使用content= new String(rs.getString(2).getBytes(),GBK)或者content= new String(rs.getString(2).getBytes(),再存入数据库即存得还是UTF-8编码。2. 数据库里的中文是GBK,如果转换为UTF-8,使用content= new String(rs.getString(2).getBytes(UTF-8)或者content= new String(rs.getString(2).getBytes(UTF-8),GBK),再直接使用update或者insert语句插入到数据库,即存得UTF-8。3. 如果某个String是GBK,要转换为UTF-8,也是使用content= new String(GBKstr.getBytes(UTF-8)或者content= new String(GBKstr.getBytes(UTF-8),GBK); 如果某个String是UTF-8,要转换为GBK,应该使用new String(UTFstr.getBytes(GBK),UTF-8)。九、数据库连接方式使用缺省,即不跟参数1. str2=new String(GBKstr.getBytes(UTF-8),ISO-8859-1),可以将数据库里的GBK编码转换为UTF-8。2. 读取UTF-8然后存入UTF-8,则用str1=new String(UTFstr.getBytes(),ISO-8859-1)或者str1=new String(UTFstr.getBytes(GBK),ISO-8859-1)。3. 不能实现数据库里的UTF-8转换为GBK。如果采用UTF-8的数据库连接方式或者缺省数据连接方式,那么无法将UTF-8转为GBK;而GBK的数据库连接方式可以实现UTF-8和GBK的相互转换。建议大家采用GBK的数据连接方式。Unicode、UTF8 和 ISO8859-1到底有什么区别1.本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等。在下面的描述中,将以中文两个字为例,经查表可以知道其GB2312编码是d6d0 cec4,Unicode编码为4e2d 6587,UTF编码就是e4b8ad e69687。注意,这两个字没有iso8859-1编码,但可以用iso8859-1编码来表示。在下面的描述中,将以中文两个字为例,经查表可以知道其GB2312编码是d6d0 cec4,Unicode编码为4e2d 6587,UTF编码就是e4b8ad e69687。注意,这两个字没有iso8859-1编码,但可以用iso8859-1编码来表示。2. 编码基本知识最早的编码是iso8859-1,和ascii编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码,重要的有如下几个。2.1. iso8859-1 通常叫做Latin-1属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0x61=97。很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然中文两个字不存在iso8859-1编码,以gb2312编码为例,应该是d6d0 cec4两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:d6 d0 ce c4(事实上,在进行存储的时候,也是以字节为单位处理的)。而如果是UTF编码,则是6个字节e4 b8 ad e6 96 87。很明显,这种表示方法还需要以另一种编码为基础。2.2. GB2312/GBK这就是汉子的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。2.3. unicode这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。不过,相对于iso8859-1编码来说,uniocode编码只是在前面增加了一个0字节,比如字母a为00 61。需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java。2.4. UTF考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。注意,虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。不过另一方面,值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包含了很多的英文字符。3. java对字符的处理在java应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。3.1. getBytes(charset)这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照charset编码,并以字节方式表示。注意字符串在java内存中总是按unicode编码存储的。比如中文,正常情况下(即没有错误的时候)存储为4e2d 6587,如果charset为gbk,则被编码为d6d0 cec4,然后返回字节d6 d0 ce c4。如果charset为utf8则最后是e4 b8 ad e6 96 87。如果是iso8859-1,则由于无法编码,最后返回 3f 3f(两个问号)。3.2. new String(charset)这是java字符串处理的另一个标准函数,和上一个函数的作用相反,将字节数组按照charset编码进行组合识别,最后转换为unicode存储。参考上述g
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上饶预制化粪池施工方案
- 卸车指挥工设备维护与保养考核试卷及答案
- 中药灸熨剂工三级安全教育(班组级)考核试卷及答案
- 药械科不良安全事件培训课件
- 信息传播策略优化分析报告
- 2025版司法局《涉嫌抢劫罪的法律意见书》(空白模板)
- 精密过滤器施工方案
- 门面装饰工程施工方案
- 咨询公司项目规划方案
- 城市建筑纸浆配送方案设计
- 云计算对法律数据处理模式的重塑-洞察阐释
- 幼儿跑酷培训
- 医疗行业实验室自动化的趋势和影响
- 会诊联络精神病学
- 【劳动教育】幼儿劳动启蒙教育清单
- 家居门店店面管理制度
- 护理病例汇报演讲
- GB/T 2099.31-2025家用和类似用途插头插座第31部分:装有USB电源的插座的特殊要求
- 运输安装费合同协议
- 母子亲属房产赠与合同5篇
- 《当代企业经营战略》课件
评论
0/150
提交评论