`
javachs
  • 浏览: 122942 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SQLITE中文编码转换的问题终于解决了。(转载)

阅读更多
SQLITE中文编码转换的问题终于解决了。

从数据库取的时候直接用rs.getBytes("username")取得byte[],而不是用rs.getString("username")取STRING。

通过取得的BYTE来转即可以得到正常的中文,否则怎么转都是乱码。

byte[] val = rs.getBytes(cols_name);
data.put(cols_name, new String(val,"GBK"));

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

关键字: java 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的数据连接方式。
分享到:
评论

相关推荐

    解决Sqlite中文排序问题(网页)

    本篇文章将深入探讨如何解决SQLite中文排序的问题。 首先,我们需要理解中文字符排序的核心在于Unicode Collation Algorithm(Unicode排序算法)。Unicode是定义全球各种语言字符的标准,而Unicode排序算法提供了...

    sqlite3 for delphi 解决中文乱码问题

    "sqlite3 for delphi 解决中文乱码问题"这个主题,正是针对这一问题提供了解决方案。这里我们将详细探讨SQLite3在Delphi中的应用,中文乱码的成因,以及如何通过自定义修改来解决这个问题。 首先,SQLite3是一个轻...

    Shape与Sqlite数据转换

    当我们处理地理空间数据时,有时需要将Shapefile转换为SQLite数据库,或者反过来,将SQLite中的数据转换为Shapefile。下面我们将详细探讨这两种转换的过程、相关的工具和注意事项。 1. Shapefile转SQLite: - **...

    Sqlite3中文路径解决

    在使用SQLite3数据库时,有时会遇到一个...在提供的"解决Sqlite3中文路径问题"压缩包中,可能包含了示例代码或工具,用于演示如何实现这一功能。学习并理解这些代码,将有助于深入理解如何在实际项目中解决类似问题。

    android Sqlite城市编码表带city_num

    本资源"android Sqlite城市编码表带city_num"显然是一个与地理位置信息处理相关的SQLite数据库文件,特别关注的是城市编码以及对应的`city_num`字段。 城市编码通常指的是按照一定规则分配给各个城市的唯一标识符,...

    java读sqlite数据库到JTable(解决sqlite中文乱码问题).docx

    解决这个问题的方法是将 SQLite 数据库中的中文字符转换为 GBK 编码。使用以下代码将乱码转换为 GBK 编码: ```java str = new String(rspos1.getBytes(i), "GBK"); ``` 这将将乱码转换为 GBK 编码,使得中文字符...

    sqlite数据库存取中文乱码的全部解决方案

    sqlite数据库存取中文乱码的全部解决方案(包括其它数据库oracle+sqlserver+mysql) 数据库的连接方式、数据库里存放数据的字体编码、所选编程语言的缺省字体编码。如果在编程中遇到不能正确显示中文时、、、、

    sqlite shape 格式转换

    4. 字符编码:确保数据的字符编码兼容,避免转换过程中出现乱码问题。 此外,如果你需要将数据从Shapefile反向转换为SQLite,也可以使用类似的 ogr2ogr 命令,只是将输出格式和输入/输出文件对调: ```bash ogr2...

    SQLite源码(解决中文乱码和中文模糊查询问题)

    针对“SQLite源码(解决中文乱码和中文模糊查询问题)”这个主题,我们将探讨SQLite如何处理中文字符编码、可能出现的乱码问题,以及中文模糊查询的实现机制。 首先,SQLite默认使用UTF-8编码存储数据,这是对中文...

    SQLite时间转化问题

    SQLite 时间转换问题 SQLite 中的日期和时间函数是数据库管理中非常重要的一部分,掌握这些函数可以帮助开发者更好地处理日期和时间的转换操作。下面是 SQLite 中五个时间函数的介绍: 1. date() 函数:该函数...

    C# sqlite 中文乱码的解决方法

    可以解决中文乱码问题,共享给大家,解决UTF-8 转换 gb2312,直接放到Bin目录中并引用

    C#解决SQlite并发异常问题的方法(使用读写锁)

    本文实例讲述了C#解决SQlite并发异常问题的方法。分享给大家供大家参考,具体如下: 使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的问题。 SQLite是文件级别的数据库,其锁也是文件级别的:多个线程...

    sqlite常见问题中文

    sqlite_libencoding —— 返回SQLite库(SQLite library)的编码(encoding)。 sqlite_libversion —— 返回SQLite库(SQLite library)的版本。 sqlite_next —— 返回下一行的行号。 sqlite_num_fields —— 取得...

    QSqlQueryModel sqlite QT 中文问题处理

    综上所述,解决QSqlQueryModel在sqlite数据库中的中文问题,需要关注编码设置、数据转换、模型显示以及数据库表的字符集配置。通过以上步骤,应该能够避免中文乱码,实现顺利的数据交互。在实际项目中,一定要细心...

    sqlite 支持中文模糊查询

    总的来说,现代SQLite版本已经具备了支持中文模糊查询的能力,只要正确配置字符集并注意相关编码问题,就能在你的应用中顺畅地进行中文数据的检索。如果你在使用过程中遇到任何问题,记得检查上述几点,或者查阅...

    SQLITE数据库查询时中文乱码

    综上所述,解决SQLite数据库查询时的中文乱码问题,主要涉及数据库连接、表结构定义、数据插入、查询以及文件操作等多个环节的编码设置。通过检查并调整这些环节,可以有效地避免和解决中文乱码问题。对于文件名为`...

    解决sqlite developer过期问题

    运行此批处理,即可解决sqlite developer的过期问题

    SQLITE3支持中文路径delphi7

    在处理中文路径时,由于编码问题,可能会遇到一些挑战,但通过特定的封装库或API调用,可以解决这一问题。 标题"SQLITE3支持中文路径delphi7"所涉及的关键知识点包括: 1. SQLite3:SQLite3是一款自包含、无服务器...

    中文sqlite(中文路径,中文文件名,中文表名,中文列名,中文内容)

    该项目为unicode编码格式,一个简单的操作sqlite的Demo,支持简单的增删查改,支持中文路径,中文文件名,中文表名,中文列名,中文内容。可以在此基础上添加自己想要的各种操作 项目中用到的sqlite3.dll,sqlite3....

    sqlserver转换sqlite

    描述中提到的“快速转换”和“快速导出sqlserver数据库数据到sqlite中”涉及到数据迁移的效率问题。这通常包括选择合适的工具、方法和策略来最小化迁移时间和数据丢失的风险。转换过程可能包括数据类型映射、表结构...

Global site tag (gtag.js) - Google Analytics