`
haoningabc
  • 浏览: 1482905 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

latin1转gbk的乱码问题,jdbc的bug

    博客分类:
  • sql
阅读更多
有时候json文件,纯文本的文件在nginx或者tomcat上为乱码
可能不像html或者jsp那样可以设置字符编码
注意nginx和tomcat都有utf8的配置
另外要注意
文件也有编码
linux下用vim打开
:set encoding=utf-8
:set fileencoding=utf-8


转http://ssmax.net/archives/1136.html
参考http://www.wcode.net/plus/view.php?aid=246850
由于以前偷懒的原因,很多数据库都是使用latin1作为字符编码,这样可以原样保留数据的字节流,但是最近发现新版的mysql驱动,包括345各版本的最新驱动,用characterEncoding=latin1 参数去访问数据,都会出现问号乱码的问题。

在网上查了一下,有人说是驱动里面自带强制转换,所以出了问题,根据提示看了一下代码,果然在

ResultSetRow在getString的时候,会使用 SingleByteCharsetConverter 来强制转码,发生了问题。

网上说要修改驱动,我自己尝试了一下,既然强制转码里面选择了使用cp1252,那这个字符集应该也是单字符全集,所以我直接尝试用该字符集来连接,问题就解决了。。。。

有两种解决方案:

1. 使用ResultSet中的getBytes方法,直接获取原始bytes数组,自己按照录入时候的编码new String即可。

2. 如果用了框架结构,写了必须获取String的,那么连接参数可以写

characterEncoding=cp1252

程序使用的时候

rs.getString(1).getBytes(“cp1252″)

即可获取原始字节数组,然后也是按照录入编码进行 new String 即可。

注意这种方法可能会引起问题,由于cp1252对一些字节的处理并不是我们理解的那样,比如

MySQL translates 0×81 to Unicode 0×0081, 0x8d to 0x008d, 0x8f to 0x008f, 0×90 to 0×0090, and 0x9d to 0x009d.

如果汉字里面刚好有着3中字节的,就会出问题,显示问号。。。

研究了一下,发了一个bug帖,http://bugs.mysql.com/bug.php?id=64071

估计也是没人理会的了,呵呵,就当练练英文。


我的程序:
con = (Connection) DriverManager
					.getConnection(
							"jdbc:mysql://1231231231213:3365/origin_chapters?characterEncoding=cp1252",
							"bookapp_r", "6c0a3ebf4");
chapter.setChapter_content(new String(rs.getString("Content").getBytes("cp1252"), "gbk"));
分享到:
评论
1 楼 yvfish 2014-01-27  
今天遇到的问题就是这个原因,cp1252

客户有一个旧数据库是mysql4.0,用的latin1,以前都是在Java中统一转成GBK的
new String(String.valueOf(fieldValue).getBytes("latin1"), "GBK");

今天客户发现”岠”字会乱码,然后把latin1改成cp1252问题解决。

相关推荐

    好东西 mySQL数据库latin1-gbk,gbk-utf8,gbk-big5

    MySQL数据库在处理字符编码时,经常涉及到不同的字符集转换,如latin1到gbk,gbk到utf8,甚至gbk到big5等。这些转换在处理多语言数据或者迁移数据库时尤其重要,因为不同的字符集支持不同的字符范围,比如latin1主要...

    C# 将中文乱码转换成中文

    常见的字符编码有ASCII、ISO-8859-1(Latin-1)、GB2312、GBK、UTF-8等。其中,ISO-8859-1主要支持西欧语言,而GB2312是早期的简体中文编码标准,UTF-8则是一种通用的多字节编码,广泛应用于互联网。 #### 2. 编码...

    乱码 编码方式解决 gbk ISO8859-1 utf8 编码

    本文将针对标题中的几种常见编码格式(GBK、ISO 8859-1、UTF-8)以及如何解决由这些编码方式引发的乱码问题进行深入探讨。 #### 一、编码概述 1. **GBK编码**:GBK是GB2312标准的扩展,支持简体中文,是Microsoft ...

    易语言unicode编码到GBK

    这些函数通常包括“字符串转GBK”和“GBK转字符串”等,它们内部实现了对字节序列的解析和重构。 3. 字节顺序标记(BOM):Unicode编码中,有时会包含一个字节顺序标记(Byte Order Mark, BOM),用于标识字节流的...

    关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    - 从ISO-8859-1编码转换到GBK或UTF-8时,可能会出现乱码问题,因为某些ISO-8859-1字符可能无法正确地映射到GBK或UTF-8中: ```java String isoStr = "a?"; byte[] isoBytes = isoStr.getBytes("ISO-8859-1"); ...

    mysql乱码问题解决

    由此可以看出,服务器端和数据库使用的是GBK编码,而客户端和连接则使用的是Latin1(ISO-8859-1)编码。这种情况下,如果在客户端插入包含GBK字符的数据,就会因为编码不一致而产生乱码。 #### 三、解决方案 针对...

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

    ISO-8859-1,又称为Latin-1,是一种单字节编码,只包含西欧语言的基本拉丁字母。在处理英文为主的程序时,ISO-8859-1是足够用的,但无法正确显示中文或其他非拉丁字符。 GBK 是针对中文的一种编码,它是GB2312的...

    解决中文乱码问题-java

    在Java中,常用的编码有`ISO-8859-1`(也称为`latin1`)、`GBK`、`UTF-8`等。 ### 具体操作步骤 #### 1. 明确源编码 在处理来自HTTP请求的参数时,`request.getParameter()`方法默认使用`ISO-8859-1`编码读取参数...

    mysql中文乱码问题

    默认情况下,character_set_server 变量的值是 latin1,這导致了中文乱码问题的出现。另外,数据库的编码方式也可能是导致乱码问题的原因。如果数据库的编码方式不是 utf8, 那么在插入中文数据时就会出现乱码问题。...

    MySQL数据库系统中文乱码问题及解决方案.pdf

    MySQL数据库系统中文乱码问题及解决方案 MySQL数据库系统中文乱码问题是指在使用MySQL数据库系统时,中文字符在存储、传输和显示过程中出现乱码的问题。这种问题的出现是由于字符集和编码方式的不兼容所致。 在...

    JDBC连接mysql乱码异常问题处理总结

    例如,如果我们向默认字符集为utf8的数据表插入utf8编码的数据前没有设置连接字符集,那么插入的数据将经过latin1=>latin1=>utf8的字符集转换过程,导致乱码。如果我们向默认字符集为latin1的数据表插入utf8编码的...

    如何解决MYSQL数据库中文乱码问题-.docx

    MYSQL数据库支持多种字符集,包括gbk、utf8、latin1等。在创建数据库时,可以使用CREATE DATABASE语句指定字符集类型,例如: CREATE DATABASE haichen CHARACTER SET gbk COLLATE gbk_chinese_ci 这里,gbk是指...

    linux乱码问题的解决办法

    ### Linux乱码问题解决方案 #### 一、理解乱码产生的原因 在Linux环境中,乱码问题通常是由于不同操作系统之间的字符编码差异所导致的。Windows系统默认采用GBK编码(早期使用GB2312),而Linux则普遍使用UTF-8编码...

    C#连接Sybase数据库,并解决C#读取Sybase乱码的问题

    4,乱码问题:sybase使用latin1字符集的时候,c#中读取字符串会是乱码,进行如下转换就行: System.Text.Encoding.GetEncoding("gbk").GetString( System.Text.Encoding.GetEncoding("latin1").GetBytes( s );

    Mysql插入中文乱码问题解决

    通常,MySQL 的默认字符集是 Latin1(ISO 8859-1),这是一种西文字符集,并不支持中文字符。当尝试存储中文数据时,由于字符集不匹配,就会导致乱码现象。 此外,需要注意的是 UTF-8 是一种国际通用的编码格式,它...

    关于Mysql、Php、phpMyAdmin、Zend 乱码的问题?

    Mysql支持多种语言字符集,包括utf8、gb2312、big5、gbk、latin1、latin2、ascii等。这些字符集可以满足不同的语言需求。 数据库表中对字段字符集的设置 在数据库表中,我们需要对字段字符集进行设置。我们可以...

    解决连接mysql中文显示乱码

    常用的字符集有`latin1`、`utf8`、`gbk`等,其中`utf8`对中文的支持较好。 #### 3. **连接参数的正确设置** 当使用Java或JSP等语言连接MySQL时,必须确保连接参数中包含正确的字符集设置。这通常通过URL参数`...

    linux乱码问题的解决方法完整版

    ### Linux乱码问题解决方案 #### 一、理解乱码产生的原因 ... set fileencodings=utf-8,ucs-bom,gbk,latin1 ``` 通过以上步骤,可以有效地解决Linux环境下的乱码问题,无论是文件内容还是文件名,都能得到妥善处理。

Global site tag (gtag.js) - Google Analytics