Java getBytes字符集问题

摘要:
今天,我在工作中再次遇到了java字符集的问题,这次是由getBytes方法引起的。在过去,我已经多次解决了Java字符集和乱码的问题。我想我很了解这个问题。今天,在又一次深入研究之后,我发现了以前的理解中存在的问题。下一次,我将在应用程序级别对getBytes方法进行更实际的解释。

今天工作中又一次遇到了java字符集问题,这次是由getBytes方法导致的。  

   以前的时候,曾经很多次的解决过java字符集以及乱码的问题,以为对这块很了解了,至到今天的又一次深入的学习,才发现以前的认识当中存在的问题,下次就getBytes方法在应用级别进行比较实际的解释。

   1、Unicode是一种编码规范,是为解决全球字符通用编码而设计的,而rUTF-8,UTF-16等是这种规范的一种实现。

   2、java内部采用Unicode编码规范,也就是支持多语言的,具体采用的UTF-16编码方式。

   3、不管程序过程中用到了gbk,iso8859-1等格式,在存储与传递的过程中实际传递的都是Unicode编码的数据,要想接收到的值不出现乱码,就要保证传过去的时候用的是A编码,接收的时候也用A编码来转换接收。

   4、如果双方的file.encoding确保都相同,那就省事了,都默认转了,但往往在不同项目交互时很多时候是不一致的,这个时候是必须要进行编码转换的。

    5、无论如论转换,java程序的数据都是要先和Unicode做转换,这样也就是能处理多语言字符集的原因了。底层保持了一致,只要在传值和接值的时候也一致就肯定不会出现乱码了。

    6、在看懂以上5点之后,请参考demo示例如下:

         //Demo.java   该java文件编码方式为UTF-8

         

package test;

public class Demo {

public static void main(String args[])throws Exception {

String str = "中文字符";

System.out.println("original string---" + str);// 会正常输出原始串

/**

* str.getBytes();//如果括号中不写charset,则采用的是Sytem.getProperty("file.encoding"),即当前文件的编码方式,

* 很多人写的是系统的默认编码,通过代码测试并非如此,实际得到的是文件的编码方式*

*  

* str.getBytes("charset");//指定charset,即将底层存储的Unicode码解析为charset编码格式的字节数组方式

*  

* String new_str=new String(str.getBytes("utf-8"),"gbk"));

* //将已经解析出来的字节数据转化为gbk编码格式的字符串,在内存中即为gbk格式的字节数组转为Unicode去交互传递

*/

String new_str = new String(str.getBytes("utf-8"), "gbk");

    /**

     * 此时的输出是乱码,在UTF-8的file.encoding下输出gbk格式的数据肯定是乱码,但是new_str的确是gbk编码式的

     * 此时的乱码源于encoding不符,但gbk格式的new_str本身数据并没有问题,通过下面的转换也可以看得出来

     */

System.out.println("new string----" + new_str);

String final_str = new String(new_str.getBytes("gbk"), "utf-8");//此处的含意与最上边的注释是一致的参数含意

/**

*输出是正常的,此时将gbk编码格式的new_str字符串,用gbk这个charset去解析它,然后用utf-8再转码一次,

    因为new_str确实是gbk格式的,才能经过utf-8编码得到正常的数据显示。

*/

System.out.println("final string---"+final_str);

}

}

仅为今天个人学习所得,若有不足,敬请交流

免责声明:文章转载自《Java getBytes字符集问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CentOS 7 安装、配置、使用 PostgreSQL 9.5及PostGIS2.2PHP代码层防护与绕过下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

asp中接收到querystring是utf8编码的处理方式

<% response.charset = "utf-8"response.write URLDecode(request.querystring("msg") +"<BR>") Function URLDecode(sConvert)     Dim aSplit     Dim sOutput     Dim I     If IsN...

GB2312编码(为什么要加2020H、8080H,外码→内码→交换码→字形码)

为什么要加上2020H和8080H? 区位码、内码、国标码怎么转换非常简单,但是令人迷惑的是为什么要那么转换?这种转换不可能平白无故地那样转换! 我搜索很多资料,找到最好的解释,总结如下: 首先,注意到一点,GB2312虽说是对中文编码,但是里面有对26个英文字母和一些特殊符号的编码,按理说这和ASCII重合的部分应该无需设置,沿用ASCII中不就行了?但...

C# 实现屏幕键盘 (ScreenKeyboard)

原文地址:http://www.cnblogs.com/youzai/archive/2008/05/19/1202732.html 要实现一个屏幕键盘,需要监听所有键盘事件,无论窗体是否被激活。因此需要一个全局的钩子,也就是系统范围的钩子。 什么是钩子(Hook) 钩子(Hook)是Windows提供的一种消息处理机制平台,是指在程序正常运行中接受信息之...

python编码及requests乱码问题

1.字符编码简介 1.1. ASCIIASCII(American Standard Code for Information Interchange),是一种单字节的编码。计算机世界里一开始只有英文,而单字节可以表示256个不同的字符,可以表示所有的英文字符和许多的控制符号。不过ASCII只用到了其中的一半(x80以下),这也是MBCS得以实现的基础。...

java字符格式

http://blog.chinaunix.net/uid-12348673-id-3335300.html http://blog.csdn.net/zhouyong80/article/details/1900100无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题。尤其在web应用中常常需要处理中文字符,这时就需要进行字符串的编码转换,将...

Python 编码简单说

先说说什么是编码。 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码。编码方案(encoding scheme)规定了字符串是如何编码的。 python编码,其实就是对python字符串的编解码问题,这也是为什么在python中,只有字符串,才有decode和encode方法。在python中,字符串为str类型,其父类为basestr...