`

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&use Unicode=

  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&Use Unicode=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。

分享到:
评论

相关推荐

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

    ### JAVA字符编码详解:Unicode, ISO-8859-1, GBK, UTF-8 及其相互转换 #### 一、引言 在Java编程中,字符编码的管理和转换是一项基本而又重要的任务。不同的编码标准适用于不同的场景,而理解和掌握这些编码之间...

    GBK GB2312 UTF-8 ISO-8859-1区别

    字符编码标准之GBK、GB2312、UTF-8和ISO-8859-1的比较 字符编码标准是计算机领域中的一项基本技术,用于将文字或符号转换为计算机能够识别的二进制代码。常见的字符编码标准有GBK、GB2312、UTF-8和ISO-8859-1等,...

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

    ### 关于JAVA字符编码:Unicode, ISO-8859-1, GBK, UTF-8 编码及相互转换 在Java开发过程中,字符编码是处理文本数据的基础,不同的编码方式会影响数据的存储、传输以及显示。本文将详细介绍几种常见的字符编码...

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

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

    IDEA编码GBK不可映射字符解决方法

    1. 了解IDEA的编码机制:IDEA支持多种编码方式,包括UTF-8、GBK、ISO-8859-1等。了解IDEA的编码机制可以帮助开发者更好地解决编码相关问题。 2. understands GBK编码的特点:GBK编码是一种简体中文编码方案,它支持 ...

    GBK、UTF-8编码转换工具

    本程序的目的是为了把文件编码格式统一。如果文件内容编码不同,则也不能保正...缺点:比如iso-8859-1的内容转换成utf-8。则可能失败。。 优点:java文件,txt/xml/dat文件。只要都是能识别的内容,即转换成功就更大。

    CodeDetector:检测文件编码,现在支持UTF-8,GBK,UTF-16LE,UTF-16BE,Java

    CodeDetectorDetect File encoding, Now support UTF-8,GBK,UTF-16LE,UTF-16BE, Java检查文件编码,主要针对中文文本。目前支持 UTF-8(BOM或无BOM)、GBK、UTF-16LE、UTF-16BE单个文件或文件夹,支持编码批量转换。...

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

    然而,这种方法仅适用于UTF-8的检测,且无法识别其他编码格式,如GBK、ISO-8859-1等。当需要处理各种未知编码格式的文件时,可以借助第三方库cpdetector。 cpdetector是一个轻量级的开源项目,它的大小大约为500KB...

    解决source insight3.5不支持中文utf8问题

    这个问题主要源于Source Insight对非ASCII字符的处理机制,它可能期望的是其他字符集,如GBK或ISO-8859-1。 解决这个问题的方法通常包括以下步骤: 1. **配置Source Insight的编码设置**:进入Source Insight的...

    java 解决异常 2 字节的 UTF-8 序列的字节2 无效的问题

    1. **文件编码不正确**:文件可能被错误地标识为UTF-8编码,但实际内容可能是其他编码,比如GBK或ISO-8859-1。这会导致解析器在尝试解码时出现问题。 2. **数据损坏**:文件或网络传输过程中可能发生了错误,导致...

    各种字符集编码表,包括iso-8859-1,gbk,gb18030, unicode

    本文将深入探讨四种常见的字符集编码:ISO-8859-1、GBK、GB18030以及Unicode,并结合Java国际化的字符集转换进行详细说明。 1. ISO-8859-1:这是一种西欧字符编码,包含拉丁字母、数字、标点符号和一些特殊字符。它...

    java编码格式转换

    - 这种转换会导致乱码,因为GBK编码的字节流不能直接转换为ISO-8859-1编码。 - 解决方法:先将GBK编码的字节流转换为Unicode,然后再从Unicode转换为ISO-8859-1。 - 示例:`String s = "中文"; byte[] gbks = s....

    字符集--Java编码相关.doc

    有三种常见的选择:ISO8859_1、GBK和UTF-8。ISO8859_1适用于西方字符,适合与Linux和MySQL等西方软件配合;GBK是针对中文的编码,适用于Windows环境。然而,这两种方案都要求开发、编译和运行环境的编码与之匹配,...

    java字符集编码问题

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

    ISO-8859.docx

    ISO-8859-1和UTF-8是两种常见的字符编码标准。ISO-8859-1是一种单字节编码,覆盖了大部分西欧语言的字符,但它不支持中文或其他多字节字符。而UTF-8是一种变长编码,可以表示Unicode字符集中的所有字符,包括中文、...

    Java文件编码转换源码

    描述中提到,这个示例已经测试了GB2312到UTF-8以及UTF-8到GB2312的转换,但不支持ISO-8859-1编码。ISO-8859-1是一种单字节编码,主要用于西欧语言,如果需要支持,只需要将`Charset.forName()`中的编码名替换为"ISO-...

    java中编码的转换

    本文将深入探讨在Java中处理字符编码,尤其是UTF-8和GBK编码的转换技巧,以及如何在不同的场景下(如JSP页面与纯Java类文件)确保中文的正确显示。 ### 一、数据库连接方式与字符编码 #### 1. 使用UTF-8进行数据库...

    java文件字符编码检测和转换

    字符编码检测和转换 附件中:FileEncodeDetector.java 此文件可以检测指定文件... "UTF-8", new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".java"); } });

Global site tag (gtag.js) - Google Analytics