当前位置: 首页 > 编程日记 > 正文

java sql编码_java+sql 编码 UTF-8、ISO-8859-1、GBK

java 编码 UTF-8、ISO-8859-1、GBK

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的数据连接方式。

相关文章:

.NET三层架构

三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。 …

【C#串口编程计划】C#通讯类库构建

这篇图文是关于【串口编程计划】的最后一篇“C#通讯类库的构建”,也就是把这次所做的关于串口系统的代码集成到团队的类库中,做到代码的可复用(以后写串口的系统,只需要写数据的定义,协议的解析部分就好,通…

WhatsApp与Gmail用户数均突破10亿大关

北京时间2月2日早间消息,FacebookCEO马克-扎克伯格(Mark Zuckerberg)周一宣布,WhatsApp的用户数突破了10亿。今天,谷歌CEO桑德尔-皮查伊(Sundar Pichai)也在财报电话会议中披露,Gmail活跃用户数已突破10亿。 两年前,Fa…

linux 普通用户 mysql_Linux普通用户部署mysql

1、添加一个新用户,并设置密码user testpasswd test2、解压安装包,并重命名为mysqltar zxvf mysql-5.5.54-linux2.6-x86_64.tar.gz3、移除data目录数据rm -rf data/*4、拷贝配置文件cp support-files/my-medium.cnf my.cnf5、新建一个script目录作为启动…

JQUERY搞的相册导航DEMO教学,总有一款合心意

JQUERY搞的相册导航DEMO教学,总有一款合心意 偶然看到的,老外小结的,用jquery搞的相册导航,总有一款合心意,25款哦http://vandelaydesign.com/blog/web-development/jquery-image-galleries/posted on 2009-08-08 00:15 jackyrong的世界 阅读(...) 评论(...) 编辑 收…

ASP.NET Aries JSAPI 文档说明:AR.Form、AR.Combobox

AR.Form 文档 1:对象或属性: 名称 类型 说明 data 属性 编辑页根据主键请求回来的数据 method 属性 用于获取数据的函数指向,默认值Get objName 属性 用于拦截form表单的请求数据对象名,可以表名,视图名 t…

【通俗理解线性代数】 -- 矩阵与空间的基和坐标

本微信图文从矩阵与坐标系的角度对矩阵进行了通俗化介绍!

mysql 5.7 mts_MySQL:MTS和mysqldump死锁

###一、问题来源这是一位客户的提供的案例如下,show processlist截图如下:![image.png](https://upload-images.jianshu.io/upload_images/7398834-82e9b0bbd7244fbe.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)出现这种问题除非手动干预…

SQL SERVER 获取表结构信息《转载》

获取表信息SELECT表名 casewhena.colorder1thend.name elseend, 表说明 casewhena.colorder1thenisnull(f.value,) elseend, 字段名 a.name, 主键 casewhenexists(SELECT1FROMsysobjects wherextypePKandparent_obja.id andname in( …

混合托管:第三代云计算

企业在选择技术时,都必须立足公司的未来,并保持自己的理念和观点。而技术经过几代改进,才能更加广泛地应用。 以磁盘驱动器作为例子。磁盘驱动器作由IBM公司1953年研发,每一次更新换代时,新的磁盘驱动器的容量更大&…

【通俗理解线性代数】 -- 特殊的矩阵

本微信图文主要介绍了旋转矩阵、对角矩阵和矩阵乘法的几何与物理意义。

mysql 数据库 数组类型转换_mysql数字类型的数据如何进行转换?

如何将MySQL数据库中的数字类型转换为数字函数,今天给大家介绍mysql中的转换函数,这个在实际的生活应用中是运用广泛的,大大减少了我们自己手动进行数字类型的转换。我们今天主要向大家介绍的是用MySQL数字类型如何正确的转换函数(concat/cas…

测试用例设计规范

1、引言 测试设计遵循与软件设计相同的工程原则。好的软件设计包含几个对测试设计进行精心描述的阶段。这些阶段是: ● 测试策略 ● 测试计划 ● 测试描述 ● 测试过程 上述四个测试设计阶段适用于从单元测试到系统测试各个层面的测试。 测试设计由软件设计说明所驱…

【通俗理解线性代数】 -- 矩阵的等价与相似

本微信图文通俗讲解了矩阵等价与矩阵相似的意义。

Martin Fowler对全世界程序员的建议

对全世界的程序员我都是那么几条建议。第一,每年学习并熟悉一个新的编程语言。坚持几年,你对于程序设计会有非常深刻的见解。第二,学习测试驱动开发,这种新的方法会改变你对于软件开发的看法。第三,劳逸结合&#xff0…

mysql 触发器死循环_请教如何避免该条触发器的死循环

setANSI_NULLSONsetQUOTED_IDENTIFIERONgoALTERTRIGGER[fetchlcf]ON[dbo].[RdRecords]FORINSERT,UPDATEASbeginSETNOCOUNTONdeclarebustypevarchar(12)/*单据类型*/declareidentityi...set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgoALTER TRIGGER [fetchlcf] ON [dbo].[RdRecor…

August 14, 2009 - Choice

转载于:https://www.cnblogs.com/gieno/archive/2009/08/14/1546232.html

深入Java虚拟机之虚拟机体系结构

工作以来,代码越写越多,程序也越来越臃肿,效率越来越低,对于我这样一个追求完美的程序员来说,这是绝对不被允许的,于是除了不断优化程序结构外,内存优化和性能调优就成了我惯用的“伎俩”。 要对…

【通俗理解线性代数】 -- 内积与相关

本图文从向量内积的角度引出了概率论中的相关系数,说明向量内积是线性相似性的表征。

java modelmapper_java - 使用ModelMapper映射抽象类型的字段 - SO中文参考 - www.soinside.com...

我有以下课堂知识层次:public abstract class Base {protected Boolean baseBoolean;}public class A extends Base {private BigDecimal amount;}并且尝试将DTO映射到实体public class DTO {private Base details;}public class Entity {private Base details;}并映…

基于Dialog的MFC程序在启动时隐藏为托盘程序(四)

这部分说一下如何加menu。。如果做小气球。。mfc的menu确是不如C#活着java那么easy..首先在rc里添加menu资源。。然后在ui界面里先设置一下你的菜单。。在第(二)部分已经简单知道了怎么取得tray的鼠标左右点击事件。。下面我们就把左右点击事件分开。。C…

【通俗理解线性代数】 -- 理解二次型

本微信图文介绍了二次型的几何意义以及正定在函数极值中的应用。

《Clojure数据分析秘笈》——1.6节从JDBC数据库读取数据

本节书摘来自华章社区《Clojure数据分析秘笈》一书中的第1章,第1.6节从JDBC数据库读取数据,作者(美)Eric Rochester,更多章节内容可以访问云栖社区“华章社区”公众号查看 1.6 从JDBC数据库读取数据从关系型数据库中读…

java timer cron_Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)

在Java中,实现定时任务有多种方式。本文介绍4种。Timer和TimerTask、Spring、QuartZ、Linux Cron。以上4种实现定时任务的方式。Timer是最简单的。不须要不论什么框架,只JDK就能够。缺点是不过个时间间隔的定时器,调度简单。Spring和QuartZ都…

诗歌rails之如何写一个简单的Rails Plugin

生成plugin骨架代码: Ruby代码 ruby script\generate plugin MyPlugin ruby script\generate plugin MyPlugin 功能需求: 在BlogController中把所有符合条件的Post(Model)生成为xml 如果不使用插件,很easy : in BlogController Ruby代码 def export_to_xml posts Post.fin…

【通俗理解线性代数】 -- 施密特正交化与QR分解

我们介绍线性代数知识的时候,稍微扩展一点,就能演变成一个新的角度。

iOS实现tableViewCell或collectionCell中点击界面按钮跳转

//找到父类界面 - (UIViewController *)viewController { for (UIView* next [self superview]; next; next next.superview) { UIResponder *nextResponder [next nextResponder]; if ([nextResponder isKindOfClass:[UIViewController class]]) { return (UIViewControlle…

java web 怎么用solr_使用web过滤器增加solr后台登录验证

solr后台自带是没有登录功能的,默认访问地址是:http://localhost:8983/solr/#/(内置jetty运行)。要给sorl后台增加登录验证方法:1、使用web服务器的登录验证(例如jetty、tomcat)这种方式好处是不需要另外写代码,只需配置一下对应的…

《程序设计解题策略》——1.6 利用左偏树实现优先队列的合并

本节书摘来自华章计算机《程序设计解题策略》一书中的第1章,第1.6节,作者:吴永辉 王建德 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.6 利用左偏树实现优先队列的合并 优先队列在程序设计竞赛中十分常见,在统计问题、最值问…

Jquery JQZoom Plugin 放大鏡效果 Two

Jquery JQZoom Plugin 放大鏡效果 TwoJquery1.3.2Lib下載地址:http://files.cnblogs.com/davidzhou/jquery-1.3.2.rar插件下載地址:http://files.cnblogs.com/davidzhou/jqzoom_v2.2.rarDemo下載地址:http://files.cnblogs.com/davidzhou/MagnifySol.rar…