【java基础】Java中Unicode、编码的理解

转载 2015年11月18日 16:27:27

谈谈对Java中Unicode、编码的理解

     我们经常会遇到编码问题。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")便出现了。

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

如何理解java采用Unicode编码

转自这个博客:http://blog.csdn.net/shijinupc/ 一、 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,...
  • gjb724332682
  • gjb724332682
  • 2015年01月28日 14:03
  • 2827

Java与编码问题串讲之二--如何理解java采用Unicode编码

Java开发者必须牢记:在Java中字符仅以一种形式存在,那就是Unicode(不选择任何特定的编码,直接使用他们在字符集中的编号,这是统一的唯一方法)。由于java采用unicode编码,char ...
  • shijinupc
  • shijinupc
  • 2012年06月20日 15:34
  • 7894

js和java中字符和unicode编码的转化

一般来说,良好的编程习惯要求在代码里尽量不出现中文,一个是国际化问题,即同一份代码可能要满足不同语言的显示,还一个就是可能产生乱码问题,不同的程序员用不同的IDE导入这份代码可能使用了不同的默认编码。...
  • starandsea
  • starandsea
  • 2016年07月07日 19:33
  • 1831

[java]深入理解java中的char,unicode编码及其实现方式

众所周知,java中的char采用的是unicode编码(某一字符的该编码是固定不变的),其实现方式有utf-8、utf-16和utf-32。 在Unicode字符集中的某个字符对应的代码值(uni...
  • attwice
  • attwice
  • 2015年04月08日 22:41
  • 407

java把字符串转化为unicode编码

public static String gbToUnicode(final String gbString) { char[] utfBytes = gbString.toCh...
  • u011426341
  • u011426341
  • 2015年09月20日 23:15
  • 872

将文件内容准换为unicode码内容文件(java实现)

import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; i...
  • xiuye2015
  • xiuye2015
  • 2015年08月07日 11:46
  • 658

java入门、java学习:如何理解Java面向对象

首先要说明一点,对象不是java的,事实上他只是一种概念,一种用于解决问题的程序设计的思想方法。要理解对象就必须得要和面向对象结合起来。在面向对象中把某一类事物所共有的属性和行为抽象出来之后就形成了一...
  • javaniuniu
  • javaniuniu
  • 2016年05月23日 10:59
  • 1950

Java判断String是否是中文,并把中文转换成Unicode

  • hty1053240123
  • hty1053240123
  • 2018年02月07日 23:59
  • 1032

Unicode编码和中文互转(JAVA实现)

//中文转Unicode public static String gbEncoding(final String gbString) { //gbString = "测试" ...
  • u010612373
  • u010612373
  • 2016年05月18日 09:16
  • 19305

java中unicode编码和utf8编码相互转换

1,在开发中经常会遇见有些编码使用到unicode编码的,而与我们通常使用的utf8编码不一致2,代码 /** * 转为unicode 编码 * * @param str...
  • qq_22986265
  • qq_22986265
  • 2017年12月06日 11:42
  • 89
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【java基础】Java中Unicode、编码的理解
举报原因:
原因补充:

(最多只允许输入30个字)