在Java编程中,中文字体编码难倒了不少程序员,如果抓住了影响Java中文显示的几个关键因素,问题将迎刃而解。
Java是目前最流行的面向对象的编程语言之一,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和characterEncoding
1. 网页使用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的数据连接方式。
转自
http://www.ccw.com.cn/cio/research/info/htm2005/20051118_13GHU.asp
分享到:
相关推荐
### Java如何正确使用字体编码 在Java开发过程中,正确处理字符编码是非常重要的,尤其是在涉及到数据库操作、网页数据读取等情况时。本文将详细介绍如何在Java环境中正确地使用各种字符编码,包括UTF-8、ISO-8859-...
2. **设置字体映射**: 如果PDF文档中使用了特殊的字体或编码,我们需要创建一个字体映射,确保PDFBox知道如何正确地显示这些字符。 3. **创建图像渲染器**: 使用`PDFRenderer`类创建一个渲染器,这个渲染器将负责将...
例如,如果你需要在PDF中使用中文字体,你需要一个包含中文字形的字体库,并将其加载到iText中。 以下是一个简化的代码示例,展示了如何在iText中使用自定义字体: ```java Font font = FontFactory.getFont( ...
在Java开发中,Itext是一个常用的库,...通过以上步骤,你应该能成功地在Java中使用Itext生成包含中文内容的PDF文档。如果遇到其他问题,可以查阅Itext的官方文档或者相关的技术社区,如iteye,寻求更多的帮助和支持。
总之,处理PDFBox中的Identity-H编码乱码问题需要对PDF文档结构、字体编码以及PDFBox库的内部工作原理有深入的理解。通过检查字体资源、配置字体映射、正确处理字节流、修复PDF文档以及利用社区资源,大多数乱码问题...
这需要使用Java的`Font.createFont`方法来加载字体,并使用`GraphicsEnvironment.registerFont`注册到当前的图形环境中。 总的来说,解决Linux下Java字体乱码问题涉及多个方面,包括系统字体的配置、Java环境的设置...
本篇将深入探讨如何使用PD4ML实现在Java环境中处理中文乱码问题,并提供相关文件的背景和用途。 首先,我们要理解为何会出现中文乱码。在处理非ASCII字符,如中文字符时,如果字体、编码设置不正确,就可能出现乱码...
本文将深入探讨如何在C++、Java、JavaScript、PHP和Ruby这五种编程语言中检测并转换Zawgyi-One字体编码到Unicode,以确保跨平台的文本一致性。 1. **C++**: 在C++中,处理字符串通常涉及`std::string`对象。要检测...
6. **处理资源文件**:非源代码的资源文件,如图片、字体等,一般不需要进行编码转换,但应检查相关配置文件中的编码信息是否正确。 7. **备份与恢复**:在进行编码转换前,务必做好原工程的备份,以防万一转换出现...
因此,转换时必须确保正确识别和处理TXT文件的编码,并在创建PDF时使用相同或兼容的编码。Java的`java.nio.charset.Charset`类可以帮助识别和转换字符集。 其次,字体问题涉及到PDF生成器对特定字体的支持。PDF文档...
"java URL转PDF文件(完美支持中文)"的主题着重于如何利用Java库来实现这一功能,并且确保中文字符能够正确显示。在Linux环境下,由于字符编码的问题,中文字符可能会出现乱码,但通过特定的方法和库可以解决这个问题...
在HTML转PDF时,如果原始HTML页面中没有明确指定字体,或者指定的字体在PDF生成环境中不存在,那么中文字符可能无法正确呈现。这时,我们需要确保转换过程中包含支持中文的字体资源,如"simsun.ttf"。 要解决HTML中...
本教程将深入探讨如何在Java中使用iText PDF插件处理中文字符,以及如何引入中文字体文件,创建不同大小和风格的中文字体。 首先,让我们理解`iText PDF`。iText是一个开源的Java库,它提供了一系列API用于构建PDF...
- **字体兼容性**:由于PDF可能使用各种字体,而OFD要求使用国标GB2312、GBK或UTF-8编码的字体,确保所有字体都能在OFD环境中正确显示是一项挑战。 - **图片处理**:PDF中的图片可能需要进行格式转换或压缩,以适应...
这个类可能还包含了处理字体编码、大小和样式的方法。 综上所述,这个项目涉及到使用Java处理PDF文档,添加支持中文的水印,并能灵活调整水印的相对位置。通过理解这些概念和技术,我们可以创建一个强大的工具,...
在IT行业中,文本转换是一项常见的任务,特别是在文档格式互换时。Java作为一种强大的编程语言,提供了许多库和工具来处理这种转换...记得在开发过程中,始终注意文件编码的正确性,以确保中文字符能被正确解析和显示。
总的来说,实现Java PDF导出功能并支持中文,关键在于选择合适的库,正确加载和注册支持中文的字体,以及处理好字符编码。通过以上步骤,可以确保PDF文档中的中文字符能被正确显示。在实际项目中,还需要考虑性能...
总的来说,这个项目展示了如何在Java环境中使用pd4ml库将HTML内容无水印地转换为PDF,同时解决了中文乱码问题,为开发人员提供了一个简洁有效的解决方案。在实际应用中,可以根据具体需求调整和扩展这个基础框架,...
在实际应用中,开发者需要先加载这些字体,然后指定HTML中使用的字体与PDF中对应的字体。如果HTML中引用了系统不支持的字体,或者字体包中没有包含的字体,那么转换可能会出现错误或效果不符合预期。 例如,使用...