`
wcb820710
  • 浏览: 23444 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java中如何正确使用字体编码

    博客分类:
  • Java
阅读更多
首先声明一下,此文章是从网上转载的。但是没有考虑使用不同Web Server时出现的情况,比如文章里的用 红色字体画出来的部分代码在用Tomcat时用文章中的方法,不过到了WebSphere的时候必须用原先的String name = request.getParameter("name");因此采用本文方法的时候不要太死板,多试试。
在Java编程中,中文字体编码有一定的难度,如果抓住了影响Java中文显示的关键因素,问题将迎刃而解。
Java是目前最流行的面向对象的编程语言之一,Java支持UTF-8、ISO-8859-1、GBK等各种字体编码,现在对Java中字体编码的问题,特意总结如下:

影响Java中字体编码正确显示的有几个因素:
1)数据库的连接方式;
2)网页中使用的字体编码;
3)数据库里存放数据的字体编码;
4)Java的缺省字体编码。

如果在编程中遇到不能正确显示中文的问题时,要先弄清楚以上几项所使用的字体编码,在分析找出原因,即可解决问题。众所周知,JSP是Java的一种,和网页有关,而网页也有自己的中文编码系统,所以JSP处理中文要比纯Java的类文件更为麻烦。本文的测试数据库是mySql,数据库连接驱动是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

1、从数据库中读取中文,显示在使用GBK的JSP页面里:
(1)如果数据库中存放的字体编码是UTF-8数据,在JSP页面中使用
  str = new String(rs.getBytes(1),"UTF-8");
  或者
  str = rs.getString(1);可以正确显示中文。
(2)如果数据库中存放的字体编码是GBK数据,在JSP页面中使用
  str = new String(rs.getBytes(1),"GBK");正确显示中文。

2、值得注意的是:如果网页使用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

1、从数据库中读取中文,显示在使用GBK的JSP页面里:
(1)如果数据库中存放的字体编码是UTF-8数据,在JSP页面中一定使用
  str = new String(rs.getBytes(1),"UTF-8");才可以正确显示中文。
(2)如果数据库中存放的字体编码是GBK数据,在JSP页面中使用
  str = new String(rs.getBytes(1),"GBK");
  或者
  str = rs.getString(1);即可显示正确的中文。

2、如果网页使用UTF-8,数据库中存放的是GBK,只能用
   str = new String(rs.getString(1).getBytes("UTF-8)","GBK");正确显示中文。
  如果网页使用UTF-8,而数据库中存放的是UTF-8,可以用
   str = new String(rs.getBytes(1),"GBK");
   或者
   str = rs.getString(1);正确显示中文。

三、数据库连接使用缺省方式
   在连接数据库的驱动后面没有参数——useUnicode=&characterEncoding=
   例如:jdbc:mysql://localhost/DBVF?autoReconnect=true
   没有参数useUnicode=true&characterEncoding=UTF-8,表示使用默认的ISO-8859-1编码。
1、从数据库中读取中文,显示在使用GBK的JSP页面里。
(1)如果数据库中存放的字体编码是UTF-8数据,在JSP页面中一定使用
  str = new String(rs.getString(1).getBytes(),"UTF-8");
  或者
  str = new String(rs.getString(1).getBytes("ISO-8859-1"),"UTF-8);才可以正确显示中文。
(2)如果数据库中存放的字体编码是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.getByte("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,使用
  str = new String(request.getParameter("userName").getBytes("ISO-8859-1"),"GBK");
  或者
  str = new String(request.getParameter("userName").getBytes(),"GBK");
  都可以使得存入数据库的数据是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");

九、数据库连接方式使用缺省,即不使用参数useUnicode和characterEncoding
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的数据连接方式。

<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
设置HTML网页文件编码信息,浏览器会按UTF-8来解析页面。
<%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%>
contentType的charset是指服务器发送给客户端时的内容编码,正好是HttpServletResponse.setContentType()语句;pageEncoding是jsp文件本身的编码,是用什么编码方式保存的,这样转成servlet时,就能正确的解析文件中的汉字。
分享到:
评论

相关推荐

    java如何正确使用字体编码

    本文将详细介绍如何在Java环境中正确地使用各种字符编码,包括UTF-8、ISO-8859-1、GBK等。 #### 一、字符编码简介 1. **UTF-8**:是一种可变长度的字符编码,用于Unicode标准,支持世界上几乎所有国家的文字。它是...

    Java中的字符集编码入门(五)Java代码中的字符编码转换Part1.pdf

    Java中的字符编码转换是编程实践中一个至关重要的概念,尤其是在处理多语言环境和跨平台交互时...理解Java中的字符编码转换机制对于编写能够正确处理多语言文本的程序至关重要,尤其在需要处理跨平台文件交互的场景下。

    java使用URLDecoder和URLEncoder对中文字符进行编码和解码

    这两个类位于`java.net`包下,可以帮助开发者进行字符串编码和解码,确保数据在网络传输过程中的正确性。 `URLEncoder`类提供了`encode`静态方法,用于将普通字符串编码成`application/x-www-form-urlencoded` MIME...

    JAVA 转换字符编码工具

    在Java中,每个字符串都有一个默认的字符编码,通常是平台相关的(例如,Windows系统通常默认使用GBK,而Linux系统则可能是UTF-8)。 Java提供了`java.nio.charset`包来处理字符编码。其中,`Charset`类是核心,它...

    深入分析 Java 中的中文编码问题

    Java中默认使用的是Unicode编码,但在处理外部数据时,如读取文本文件、接收HTTP请求或连接数据库时,如果没有正确设置编码,就可能导致乱码问题。例如,当读取GBK编码的文本文件,而使用UTF-8解码时,会出现乱码。 ...

    Java中的字符集编码入门(五)Java代码中的字符编码转换Part1.doc

    ### Java中的字符集编码入门(五):Java代码中的字符编码转换Part1 #### 核心知识点概述: 本文档深入探讨了Java编程语言中字符集编码的基础知识,并着重讲解了字符编码转换的基本原理及其在Java代码中的应用。...

    JAVA中文字符编码问题详解.doc

    在 JAVA 中,中文字符编码问题一直是让人头疼的问题,特别是在 WEB 应用中。网上的分析文章和解决方案都很多,但总是针对某些特定情况的。本文将详细解释 JAVA 中文字符编码问题的根源,并提供解决方案。 一、JAVA ...

    java_字符编码 Javajava_字符编码问题

    通过以上的介绍,我们可以了解到 Java 中字符串和字符编码的处理是非常重要的,特别是在跨平台和多语言环境中。正确的字符编码管理不仅可以避免乱码问题,还能提高程序的健壮性和可维护性。希望本文能帮助开发者们更...

    Java字符集编码简记

    本文将围绕“Java字符集编码简记”这一主题,深入探讨相关知识点,并结合标签“源码”和“工具”,探讨在实际开发中如何运用和处理字符编码问题。 首先,我们需要理解字符集的概念。字符集是一系列符号的集合,例如...

    Java中文字符编码探究.pdf

    在Java中,字符编码可以使用getBytes()方法将字符串转化为字节数组,并使用new String()方法将字节数组转化为字符串。但是,这些方法默认使用系统的默认字符编码方式,这可能会导致乱码问题。要解决这个问题,可以...

    Java字符集和编码

    UTF-8(Unicode Transformation Format-8)是一种可变长度的字符编码格式,主要用于在网络中快速传输Unicode字符。UTF-8的基本原理是根据Unicode字符的范围,将其映射成不同长度的编码,具体规则如下: - 每个英文...

    Java中的字符集编码入门(五)Java代码中的字符编码转换Part1[参考].pdf

    Java中的字符编码转换是编程实践中不可或缺的一部分,尤其是在处理多语言和跨平台的场景下。Java选择了UTF-16作为其内部字符表示的标准,这确保了在JVM内存中,所有字符都以统一的方式存储,避免了编码不一致带来的...

    JAVA及相关字符集编码问题

    Unicode编码解决了多语言环境中字符编码不统一的问题,使得各种语言的字符可以在同一环境中被正确处理。在Java中,字符串是以Unicode编码存储的,这意味着它可以无缝地处理各种语言的文本。 四、UTF UTF(Unicode ...

    java字符集编码问题

    通过对ISO 8859-1、GB2312/GBK、Unicode和UTF等常见编码的理解,以及Java提供的字符串操作方法(如`getBytes`和`new String`),开发者可以有效地解决实际项目中的字符编码问题,确保应用程序能够正确地处理各种文本...

    深入分析Java中的中文编码问题

    1. **统一编码**:尽可能在整个项目中使用统一的编码格式,推荐使用UTF-8。 2. **明确指定编码**:在文件读写、网络传输等场合明确指定编码格式。 3. **检查配置**:检查服务器、数据库等相关组件的字符集设置是否...

    java字符串编码转换

    在Java中,字符串的处理是非常常见的操作之一,而字符编码是确保数据正确显示的关键因素。本篇文章将重点介绍Java中字符串编码的转换方法及其在Web环境中的应用。 #### 二、Java中的字符串与字符编码 在Java中,`...

    Java判断文件编码格式 - 明明是悟空 - 博客园1

    总的来说,Java中判断文件编码格式的方法包括简单的字节匹配和使用更复杂的库如cpdetector。在实际开发中,应根据项目的具体需求选择合适的方法,确保能正确处理各种编码格式的文件,避免因为编码问题导致的乱码现象...

Global site tag (gtag.js) - Google Analytics