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

Java 正确的做字符串编码转换

    博客分类:
  • Java
 
阅读更多

Java 正确的做字符串编码转换
字符串的内部表示?
字符串在java中统一用unicode表示( 即utf-16 LE) ,
对于 String s = "你好哦!";
如果源码文件是GBK编码, 操作系统(windows)默认的环境编码为GBK,那么编译时,  JVM将 按照GBK编码将字节数组解析成字符,然后将字符转换为unicode格式的字节数组,作为内部存储。
当打印这个字符串时,JVM 根据操作系统本地的语言环境,将unicode转换为GBK,然后操作系统将GBK格式的内容显示出来。
 
当源码文件是UTF-8, 我们需要通知编译器源码的格式,javac -encoding utf-8 ... , 编译时,JVM按照utf-8 解析成字符,然后转换为unicode格式的字节数组, 那么不论源码文件是什么格式,同样的字符串,最后得到的unicode字节数组是完全一致的,显示的时候,也是转成GBK来显示(跟OS环境有关)
 
乱码如何产生? 本质上都是由于 字符串原本的编码格式 与 读取时解析用的编码格式不一致导致的。
例如:
String s = "你好哦!";
System.out.println( new String(s.getBytes(),"UTF-8")); //错误,因为getBytes()默认使用GBK编码, 而解析时使用UTF-8编码,肯定出错。
其中 getBytes() 是将unicode 转换为操作系统默认的格式的字节数组,即"你好哦"的 GBK格式,
new String (bytes, Charset) 中的charset 是指定读取 bytes 的方式,这里指定为UTF-8,即把bytes的内容当做UTF-8 格式对待。
如下两种方式都会有正确的结果,因为他们的源内容编码和解析用的编码是一致的。
System.out.println( new String(s.getBytes(),"GBK"));
System.out.println( new String(s.getBytes("UTF-8"),"UTF-8"));
 
那么,如何利用getBytes 和 new String() 来进行编码转换呢?  网上流传着一种错误的方法:
GBK--> UTF-8:    new String( s.getBytes("GBK") , "UTF-8);   ,这种方式是完全错误的,因为getBytes 的编码与  UTF-8 不一致,肯定是乱码。
但是为什么在tomcat 下,使用 new String(s.getBytes("iso-8859-1") ,"GBK") 却可以用呢? 答案是:
tomcat 默认使用iso-8859-1编码, 也就是说,如果原本字符串是GBK的,tomcat传输过程中,将GBK转成iso-8859-1了,
默认情况下,使用iso-8859-1读取中文肯定是有问题的,那么我们需要将iso-8859-1 再转成GBK, 而iso-8859-1 是单字节编码的,
即他认为一个字节是一个字符, 那么这种转换不会对原来的字节数组做任何改变,因为字节数组本来就是由单个字节组成的,
如果之前用GBK编码,那么转成iso-8859-1后编码内容完全没变, 则 s.getBytes("iso-8859-1")  实际上还是原来GBK的编码内容
则 new String(s.getBytes("iso-8859-1") ,"GBK")  就可以正确解码了。 所以说这是一种巧合。
 
如何正确的将GBK转UTF-8 ? (实际上是unicode转UTF-8)
String gbkStr = "你好哦!"; //源码文件是GBK格式,或者这个字符串是从GBK文件中读取出来的, 转换为string 变成unicode格式
//利用getBytes将unicode字符串转成UTF-8格式的字节数组
byte[] utf8Bytes = gbkStr.getBytes("UTF-8");
//然后用utf-8 对这个字节数组解码成新的字符串
String utf8Str = new String(utf8Bytes, "UTF-8");
简化后就是:
unicodeToUtf8 (String s) {
return new String( s.getBytes("utf-8") , "utf-8");
}
UTF-8 转GBK原理也是一样
return new String( s.getBytes("GBK") , "GBK");
 
 其实核心工作都由  getBytes(charset) 做了。
getBytes 的JDK 描述:Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.
 
另外对于读写文件,
OutputStreamWriter w1 = new OutputStreamWriter(new FileOutputStream("D:\\file1.txt"),"UTF-8");
InputStreamReader( stream, charset)
可以帮助我们轻松的按照指定编码读写文件。

分享到:
评论

相关推荐

    java字符串编码转换

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

    java获取字符串编码类型代码(导入直接查看结果)

    总的来说,Java中获取字符串编码类型没有一个直接的标准方法,开发者需要借助一些技巧和外部库来实现。在处理编码问题时,理解各种编码格式的特性以及它们之间的差异至关重要,这样才能有效地避免乱码问题,保证数据...

    java字符串编码获取

    本文将深入探讨Java中字符串编码的相关知识点。 1. 字符串与字符编码基础 Java中的字符串由`java.lang.String`类表示,它是一个不可变的字符序列。Java String对象默认使用Unicode编码,这是一种包含全世界大部分...

    Java设置String字符串编码方法详解

    在Java编程语言中,处理字符串编码是至关重要的,因为正确的编码和解码可以确保数据的准确性和一致性。本文将深入探讨Java中设置String字符串编码的方法,帮助开发者更好地理解和使用这些功能。 首先,我们需要理解...

    java转换字符串编码格式的方法

    在Java中,字符编码转换...总之,了解和掌握Java中的字符串编码转换方法,对于开发跨平台的应用程序和处理多语言数据具有重要意义。通过恰当的编码转换机制,可以确保数据的正确显示和处理,避免乱码等常见的编码问题。

    JAVA及相关字符集编码问题

    例如,将一个字符串从GBK编码转换为UTF-8编码时,可以先使用`getBytes("GBK")`将字符串转换为GBK编码的字节数组,然后再使用`new String(byte[], "UTF-8")`将字节数组转换为UTF-8编码的字符串。 2. `new String...

    JAVA 转换字符编码工具

    在Java中,每个字符串都有一个默认的字符编码,通常是平台相关的(例如,Windows系统通常默认使用GBK,而Linux系统则可能是UTF-8)。 Java提供了`java.nio.charset`包来处理字符编码。其中,`Charset`类是核心,它...

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

    这里的 `new String(bytes, "UTF-8")` 表示创建一个新的字符串,该字符串的字符由指定的字节数组按照 UTF-8 编码转换而来。 #### 四、具体案例分析 根据题目描述中提到的内容,我们可以看到一些具体的场景应用: ...

    Java中的字符集编码入门(五)Java代码中的字符编码转换Part1.doc

    ### Java中的字符集编码入门(五):Java代码中的字符编码转换Part1 #### 核心知识点概述: 本文档深入探讨了Java编程语言中字符集编码的基础知识,并着重讲解了字符编码转换的基本原理及其在Java代码中的应用。...

    java String 与各种进制字符之间的转换

    在Java编程语言中,String类是处理文本字符串的核心类,而与各种进制字符之间的转换是常见的编程需求。本文将详细探讨Java中如何进行String与二进制、八进制、十进制以及十六进制之间的转换。 首先,我们要了解进制...

    如何用java实现不同编码方式字符串的转换(包含异常处理、重复不终止输入、缓冲区bufferedreader的使用)

    在进行字符串转换时,确保正确识别源字符串的编码和目标编码是关键,否则可能会导致乱码。 Java中的`Charset`类提供了处理字符编码的方法。例如,我们可以使用`new String(byte[], charsetName)`构造函数将字节数组...

    使用json-lib将java对象转换成json字符串

    标题中的“使用json-lib将java对象转换成json字符串”指的是在Java编程中,利用json-lib这个库来将Java对象转化为JSON格式的字符串。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端...

    java实现字符串处理组件-源代码

    在Java编程语言中,字符串处理是一项常见的任务,它涉及到对文本数据的各种操作,如编码转换、截取、加密和解密以及数值与字符串之间的转换。本组件提供了丰富的功能,简化了这些操作。以下是对该组件及其功能的详细...

    java中英文字符串截取

    通过自定义截取逻辑,可以确保在任何编码下都能正确、完整地截取字符串,避免出现乱码或截断错误。上述代码提供了一个具体的示例,展示了如何在GBK编码下安全地截取字符串,但开发者也应熟悉其他常见编码(如UTF-8)...

    java实现十六进制字符unicode与中英文转换示例

    总结,这个示例展示了如何在Java中处理Unicode和十六进制字符串的转换,强调了理解字符编码格式和处理过程的重要性。在实际开发中,正确处理字符编码可以避免乱码问题,确保数据的准确性和一致性。同时,开发者应该...

    java使用URLDecoder和URLEncoder对中文字符进行编码和解码

    这两个类位于`java.net`包下,可以帮助开发者进行字符串编码和解码,确保数据在网络传输过程中的正确性。 `URLEncoder`类提供了`encode`静态方法,用于将普通字符串编码成`application/x-www-form-urlencoded` MIME...

    java字符集编码问题

    当指定字符集为“GBK”时,该方法会将字符串编码为字节数组“d6 d0 ce c4”。 #### 四、实践案例分析 假设有一个字符串“中文”,其在Java中的Unicode编码为“4e2d 6587”。我们可以通过以下步骤来理解Java如何...

    java中英文字符串处理.

    在处理中英文字符串时,Java能够很好地支持,无论是字符编码(如UTF-8),还是特殊字符的处理,都提供了相应的工具和方法。在实际应用中,开发者应结合具体情况选择合适的方法进行操作,确保代码的正确性和效率。

    java 字符串加密解密

    在IT行业中,字符串加密解密是信息安全领域的重要组成部分,它涉及到数据保护、用户隐私和网络安全。本项目提供了四种常见的加密解密算法的Java实现:BASE64、AES、DES和MD5。接下来,我们将深入探讨这四种算法及其...

Global site tag (gtag.js) - Google Analytics