文档章节

java unicode转GBK

圣洁之子
 圣洁之子
发布于 2015/03/02 05:42
字数 1085
阅读 894
收藏 11

精选30+云产品,助力企业轻松上云!>>>

我们经常会遇到编码问题。Java号称国际化的语言,是因为它的class文件采用UTF-8,而JVM运行时使用UTF-16(至于为什么JVM中要采用UTF-16,我没看过 相关的资料,但我猜可能是因为JAVA里面一个字符(char)就是16位的,而UTF-16正是双字节编码),都是unicode的编码。


unicode 的目标就是能支持世界上所有的字符集,也就是说几乎所有的字符集包含的字符在unicode中都有对应的编码。在unicode中,字符与代码的映射关 系,就是unicode字符集,称为UCS(Unicode Character Set),每个unicode字符编码称为code point(代码点?)。UTF-8和UTF-16是不同的UCS编码方法,UTF就是UCS Transformation Format。;


在Java 中,String的getBytes()方法就是对特定的字符串(unicode)按照给定的字符集进行编码(encode),new String()则可以按照某个字符集将字节流转换回unicode(decode)。Java里面的每一个String都是unicode编码。


再来看页面,如果不做特殊处理,Form的提交就按照页面的ContentType设置中的字符集进行编码转换,发送到后台,后台必须利用req.setCharacterEncoding来指定参数的编码格式(不同的应用服务器应有不同的指定方式),才能正确解码。


Java 里面的encode和decode都是相对于unicode而言的,encode的意思是将char[] --> XXX Encoding byte[],decode就是由XXX Encoding byte[] --> char[]。平常,当我们说“将GBK编码转换为UTF-8编码”的时候,实际的意思就是:GBK Encoding byte[] --> UTF-8 Encoding byte[],这种转换只有在需要用byte[]传输数据的时候才有意义,否则便是毫无意义的。


首先要说明的一点是:Java中的String对象就是一个unicode编码的字符串。


但是,我们通常会听到有人说:“我们需要将String由ISO-8859-1转换为GBK编码”,这又是怎么回事呢?实际上,我们并不是要“将 一个由ISO-8859-1编码的String转换为GBK编码的String”,反复说明的是,JAVA中的String都是unicode编码的,所以不存在“ISO- 8859-1编码的String”或“GBK编码的String”这样的说法。而需要转换的唯一的原因是String进行了错误的编码。我们经常会碰到由ISO-8859- 1转换为诸如GBK/UTF-8等等这样的需求。所谓的转换过程是:String --> byte[] -->String。


也许 你非常清楚这个过程的代码:new String(text.getBytes("ISO-8859-1"),"GBK")。但是,要真正理解起来并不是那么简单。表面上看似乎很容易理解, 不就是将text String对象按照ISO-8859-1的方式编码为byte[]然后再把它按照GBK的方式转换为String吗?但是这句代码很容易会被误解为: “将text String由ISO-8859-1转换为GBK编码”,这种说法是错误的。难道你见过用这样的代码:new String(text.getBytes("GBK"),"UTF-8")来对String进行编码转换的吗?


之所以你会经常看到new String(text.getBytes("ISO-8859-1"),"GBK")这句代码,是因为一个GBK的字节流被错误地以ISO-8859- 1的方式转换为String(unicode)了!发生这种情况最普遍的地方是一个GBK编码的网页向后台提交数据的时候,就有可能会看到这句代码的出 现。GBK的流被错误的当成ISO8859-1的流,所以便得到了一个错误的String。由于ISO8859-1是单字节编码,所以每个字节被按照原样 转换为String,也就是说,虽然这是一个错误的转换,但编码没有改变,所以我们仍然有机会把编码转换回来!所以那句经典的new String(text.getBytes("ISO-8859-1"),"GBK")便出现了。


如果系统误以为是其它编码格式,就有可能再也转换不回来了,因为编码转换并不是负负得正那么简单的 


 


public   class   Unicode2GB{   
      public   static   void   main(String[]   arg){   
          String   str   =   "\u53d6";   
          System.out.println(str);   
      }   
  }

 

  输出自动转换成GB码了,非要加个转换也可以:   

 

 public   class   Unicode2GB{   
      public   static   void   main(String[]   arg){   
        try{     
          String   str   =   "\u53d6";   
          str   =   new   String(str.getBytes(),"gb2312");   
          System.out.println(str);   
        }catch(java.io.UnsupportedEncodingException   e){   
        }   
      
      }   
  }}


圣洁之子
粉丝 11
博文 404
码字总数 124626
作品 0
深圳
后端工程师
私信 提问
加载中
请先登录后再评论。
Java开发过程中乱码问题理解

1、Java编译器(即编译成class文件时) 用的是unicode字符集。 2、乱码主要是由于不同的字符集相互转换导致的,理论上各个字符的编码规则是不同的,是不能相互转换的,所以根本解决乱码的方法...

osc_d6r1n9ox
2018/06/08
65
0
JAVA之编码/解码 -- 各种环境下可能会发生的乱码问题及解决方案

工作中经常遇到java编码问题,由于缺乏研究,总是无法给出确切的答案,这个周末在网上查了一些资料,在此做些汇总。 问题一:在java中读取文件时应该采用什么编码? Java读取文件的方式总体可...

solar.xie
2014/11/20
26
0
JAVA之编码/解码 -- 各种环境下可能会发生的乱码问题及解决方案

工作中经常遇到java编码问题,由于缺乏研究,总是无法给出确切的答案,这个周末在网上查了一些资料,在此做些汇总。 问题一:在java中读取文件时应该采用什么编码? Java读取文件的方式总体可...

roockee
2013/10/22
316
0
Java编码问题汇总

工作中经常遇到java编码问题,由于缺乏研究,总是无法给出确切的答案,这个周末在网上查了一些资料,在此做些汇总。 问题一:在java中读取文件时应该采用什么编码? Java读取文件的方式总体可...

jeffycf
2013/05/31
1
0
java 中 16 进制 HEX 转换成字节码形式的 UTF-8

恩,又碰到个蛋疼的编码转换问题了:要把形如 xE9xBB 的字符串转成中文。。。 在python中我们直接 print "xE9xBBx84" 即可, 在shell中我们直接 echo $'xe9xbbx84' #echo -e 'xe9xbbx84'也行......

大数据之路
2013/02/01
8.2K
1

没有更多内容

加载失败,请刷新页面

加载更多

4.17. HTTP 请求走私

文章目录 4.17. HTTP 请求走私 4.17.1. 简介 4.17.2. 成因 4.17.3. 分类 4.17.4. 攻击 4.17.4.1. CL不为0的GET请求 4.17.4.2. CL-CL 4.17.4.3. CL-TE 4.17.4.4. TE-CL 4.17.4.5. TE-TE 4.17......

osc_2wq8ft8d
27分钟前
11
0
2020年蓝桥杯B组个人题解(热的,不知道对错)

文章目录 A B C D E F G H I J 总结 现在是蓝桥杯刚结束,趁着有记忆,写下这篇博客,不知道对错,如果我错了,请指出。 A 因为是到0就结束了,那么每次看看-600是否结束,如果没有结束就+30...

osc_1m04dwae
27分钟前
0
0
AXI4_full协议详解

AXI4-full协议介绍 AXI4.0-full包含突发控制信号,所以可以进行突发传输,在只指定一次地址后,可以一次传输多达256个数据(数据的宽度取决于带宽)。主要用于往DDR或者OCM中写入大量数据时使用...

whoisliang
28分钟前
8
0
【VMWare虚拟机Centos7安装配置redis及Redis常用命令合集】

前置依赖 1.Redis依赖gcc和tcl环境,所以要先安装gcc和tcl 执行下面语句安装gcc: yum install gcc-c++ 若提示是否继续,输入y继续安装 执行下面语句安装tcl: yum install -y tcl 下载red...

osc_s4durjz5
28分钟前
10
0
LeetCode 323. 无向图中连通分量的数目(并查集)

文章目录 1. 题目 2. 解题 1. 题目 给定编号从 0 到 n-1 的 n 个节点和一个无向边列表(每条边都是一对节点),请编写一个函数来计算无向图中连通分量的数目。 示例 1:输入: n = 5 和 edge...

osc_lk0wespa
29分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部