`

java中处理字符编码(网页与数据库)

    博客分类:
  • Java
阅读更多
首先声明一下,此文章时从网上转载的。如下的某些方法是确实管用,但是从中发现了有一点不足,就是原文笔者没考虑使用不同Web Server时出现的情况,比如文章里我用红色字体画出来的部分代码在Tomcat跑的时候得用他说的方法,不过到了WebSphere的时候必须得用原先的
String name = request.getParameter("name");
所以采取本文方法的时候不要太死板,多试试。

在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/DBName?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的数据连接方式。
分享到:
评论

相关推荐

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

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

    JAVA 转换字符编码工具

    本篇将围绕"JAVA 转换字符编码工具"这个主题,深入探讨字符编码的概念、Java中的字符编码API以及`ReadFile.java`这个可能的源码文件如何处理字符编码。 首先,我们需要理解字符编码的基本概念。常见的字符编码有...

    Java字符集编码简记

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

    java字符串编码转换

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

    JAVA及相关字符集编码问题

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

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

    在Java编程中,中文编码问题是一个常见的挑战,尤其是在处理文本输入、输出以及网络通信时。本文将深入探讨Java中的中文编码问题,以及如何有效地解决这些问题。 首先,我们要了解字符编码的基本概念。字符编码是...

    java 各种数据库连接字符串

    在Java编程中,数据库连接是通过Java Database Connectivity (JDBC) API来实现的,它提供了一套标准接口,允许开发者使用Java语言与各种不同的数据库系统进行交互。连接字符串是JDBC中一个关键的概念,用于指定...

    JAVA字符编码系列三[借鉴].pdf

    Java字符编码系列三主要探讨了Java应用中遇到的编码问题,包括编码基础知识、Java与系统软件、URL、工具软件等方面的处理。文章通过“中文”二字举例,解释了不同编码方式如GB2312、Unicode、UTF-8的表示方法。 1. ...

    Java字符编码简介_动力节点Java学院整理

    Java字符编码是编程中至关重要的一个概念,尤其是在处理多语言数据时。本文主要探讨了Java中与字符编码相关的基础知识,包括ISO8859-1、GB2312、GBK、Unicode以及UTF编码。 首先,ISO8859-1是一种早期的单字节编码...

    Java中的字符集编码入门(二)编码字符集与字符集编码的区别[参考].pdf

    Java提供了java.nio.charset包来处理字符编码,例如使用Charset类进行编码和解码操作。了解这些基础知识,有助于我们编写出能够正确处理各种字符集的健壮代码,避免在国际化和本地化过程中出现错误。 总的来说,...

    java字符编码错误整理大全

    ### Java字符编码错误整理大全 #### 一、概述 在Java开发过程中,字符编码问题是非常常见且容易引发一系列乱码问题的重要因素。本篇将详细梳理Java中的字符编码相关知识点,帮助开发者解决实际工作中遇到的各种...

    JAVA主键随机+SELECT联动+数据库随机取数+F5刷新+字符编码乱码

    标题中的“JAVA主键随机+SELECT联动+数据库随机取数+F5刷新+字符编码乱码”涉及...综上所述,这个主题涵盖了Java开发中的多个方面,包括数据库操作、前端交互以及字符编码处理,这些都是构建Web应用时常见的技术挑战。

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

    尤其是在使用Java这种跨平台语言进行开发时,不同的操作系统和硬件平台可能采用不同的字符编码,这就使得在处理文本数据时很容易出现乱码等问题。本文旨在详细探讨Java中的中文编码问题,包括常见的编码格式、编码...

    java连接cache数据库说明,数据库驱动,cache可视化工具

    在Java环境中,我们通常通过JDBC(Java Database Connectivity)驱动来实现与Cache数据库的连接。以下是一些关键知识点: 1. **JDBC驱动**:为了在Java中连接Cache数据库,首先需要安装并配置Cache的JDBC驱动。...

    java字符编码转换详细过程

    ### Java字符编码转换详细过程 #### 一、Java程序的生命周期与字符编码处理流程 Java程序的生命周期可以概括为三个主要阶段:编写源代码、编译源代码以及运行编译后的类文件。在这个过程中,涉及到多种字符编码的...

    java字符集编码乱码详解

    ### Java字符集编码乱码详解 #### 一、编码与乱码基础知识 在计算机科学领域,字符集(Character Set)是指一系列符号和电子通信代码的标准集合。每种字符集都有其特定的应用场景和优势。例如,ASCII(American ...

    java db 省市区编码表

    在Java DB中,省市区编码表是一个用于存储中国省级、市级和区县级行政区域编码的数据结构,常用于地理信息系统、地址管理或者与地理位置相关的应用程序。这个表通常包含四个字段:`id`、`areaid`、`area` 和 `...

Global site tag (gtag.js) - Google Analytics