文档章节

java unicode转GBK

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

我们经常会遇到编码问题。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){   
        }   
      
      }   
  }}


本文转载自:http://blog.163.com/darlingchenlin@126/blog/static/7156283420091114103122732/

共有 人打赏支持
圣洁之子
粉丝 6
博文 306
码字总数 92734
作品 0
深圳
后端工程师
java 中 16 进制 HEX 转换成字节码形式的 UTF-8

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

大数据之路
2013/02/01
0
0
JAVA之编码/解码 -- 各种环境下可能会发生的乱码问题及解决方案

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

roockee
2013/10/22
0
0
Java 正确的做字符串编码转换

字符串的内部表示? 字符串在java中统一用unicode表示( 即utf-16 LE) , 对于 String s = "你好哦!"; 如果源码文件是GBK编码, 操作系统(windows)默认的环境编码为GBK,那么编译时, JVM将 按...

月下狼
2013/11/19
0
0
native2ascii工具使用

今天开发的时候遇到国际化的问题,使用了一下native2ascii进行字符转换,记录一下: JDK中带了一个实用的程序native2ascii, 它可以根据指定的编码集在本地字符和UNICODE字符之间进行转换. 最...

inferrrrrr
2010/05/11
0
0
native2ascii工具使用

今天开发的时候遇到国际化的问题,使用了一下native2ascii进行字符转换,记录一下: JDK中带了一个实用的程序native2ascii, 它可以根据指定的编码集在本地字符和UNICODE字符之间进行转换. 最...

穿越星辰
2010/05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
4
0
现场看路演了!

HiBlock
昨天
12
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
9
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
15
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部