论坛首页 Java企业应用论坛

Java编码浅析(注意区分三个概念)

浏览 56968 次
精华帖 (0) :: 良好帖 (11) :: 新手帖 (2) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-02-18  
andyhu1007 写道
unsid 写道
另外
"Java的class文件采用utf8的编码方式"
这句话我有些疑惑,我觉得class文件以哪种方式编码取决于编辑这个文件的编辑器,比如用EditPlus写完了代码,保存成utf-8格式就是utf-8,保存成gbk就是gbk,你的意思是不是jvm在读取String字符串的时候始终以utf-8方式读取,那么如果你将文件保存成其他各式,jvm就不认识了


我说的class文件,而不是java文件。

其实你说的是java文件的编码,那么对于这种文件的编码,当然是我们可以选择的。比如现今流行的IDE肯定会帮你创建unicode编码的文件。

如果你使用了其它编码的java文件,也能读。我估计是编译器会去猜这个文件的编码,然后转换成unicode的。如果猜错了,那么你的java文件中的内容可能就出错了。




好象是通过文件的前几个字节来判断文件的编码方式
0 请登录后投票
   发表时间:2009-02-26  
对于外部的编码,比如mysql数据的默认编码是latin1,那使用java环境发送sql中包含中文时,应该怎么做才不会乱码
0 请登录后投票
   发表时间:2009-02-27  
andyhu1007 写道

字符串编码迷思:

 

new String(input.getBytes("ISO-8859-1"), "GB18030")
 

上面这段代码代表什么?有人会说: “把input字符串从ISO-8859-1编码方式转换成GB18030编码方式”。如果这种说法正确,那么又如何解释我们刚提到的java字符串都采用unicode编码呢?

 

这种说法不仅是欠妥的,而且是大错特错的,让我们一一来分析,其实事实是这样的:我们本应该用GB18030的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码,导致生成一个错误的字符串。要恢复,就要先把字符串恢复成原始字节数组,然后通过正确的编码GB18030再次解码成字符串(即把以GB18030编码的数据转成unicode的字符串)。注意,字符串永远都是unicode编码的。

 

但编码转换并不是负负得正那么简单,这里我们之所以可以正确地转换回来,是因为 ISO8859-1 是单字节编码,所以每个字节被按照原样 转换为 String ,也就是说,虽然这是一个错误的转换,但编码没有改变,所以我们仍然有机会把编码转换回来!

按我理解,new String(input.getBytes("GB18030"))同样可以转换成功?是这样吗?

0 请登录后投票
   发表时间:2009-02-27  
dlovek 写道
andyhu1007 写道

字符串编码迷思:

 

new String(input.getBytes("ISO-8859-1"), "GB18030")
 

上面这段代码代表什么?有人会说: “把input字符串从ISO-8859-1编码方式转换成GB18030编码方式”。如果这种说法正确,那么又如何解释我们刚提到的java字符串都采用unicode编码呢?

 

这种说法不仅是欠妥的,而且是大错特错的,让我们一一来分析,其实事实是这样的:我们本应该用GB18030的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码,导致生成一个错误的字符串。要恢复,就要先把字符串恢复成原始字节数组,然后通过正确的编码GB18030再次解码成字符串(即把以GB18030编码的数据转成unicode的字符串)。注意,字符串永远都是unicode编码的。

 

但编码转换并不是负负得正那么简单,这里我们之所以可以正确地转换回来,是因为 ISO8859-1 是单字节编码,所以每个字节被按照原样 转换为 String ,也就是说,虽然这是一个错误的转换,但编码没有改变,所以我们仍然有机会把编码转换回来!

按我理解,new String(input.getBytes("GB18030"))同样可以转换成功?是这样吗?

 

不是,你这样理解是错误的。

 

自己理解下,从bytes 到 ISO-8859-1 编码的字符串,又用GB18030恢复成bytes,再用默认编码(可能并不是前两者)解码成字符串。是什么东东了阿。。。

0 请登录后投票
   发表时间:2009-02-27   最后修改:2009-02-27
andyhu1007 写道
dlovek 写道
andyhu1007 写道

字符串编码迷思:

 

new String(input.getBytes("ISO-8859-1"), "GB18030")
 

上面这段代码代表什么?有人会说: “把input字符串从ISO-8859-1编码方式转换成GB18030编码方式”。如果这种说法正确,那么又如何解释我们刚提到的java字符串都采用unicode编码呢?

 

这种说法不仅是欠妥的,而且是大错特错的,让我们一一来分析,其实事实是这样的:我们本应该用GB18030的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码,导致生成一个错误的字符串。要恢复,就要先把字符串恢复成原始字节数组,然后通过正确的编码GB18030再次解码成字符串(即把以GB18030编码的数据转成unicode的字符串)。注意,字符串永远都是unicode编码的。

 

但编码转换并不是负负得正那么简单,这里我们之所以可以正确地转换回来,是因为 ISO8859-1 是单字节编码,所以每个字节被按照原样 转换为 String ,也就是说,虽然这是一个错误的转换,但编码没有改变,所以我们仍然有机会把编码转换回来!

按我理解,new String(input.getBytes("GB18030"))同样可以转换成功?是这样吗?

 

不是,你这样理解是错误的。

 

自己理解下,从bytes 到 ISO-8859-1 编码的字符串,又用GB18030恢复成bytes,再用默认编码(可能并不是前两者)解码成字符串。是什么东东了阿。。。

不好意思,我还是没有理解。“我们本应该用GB18030的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码“,意思是说input中的byte[]是以GB180303编码,却我们解码时候错误使用了ISO-8859-1?

0 请登录后投票
   发表时间:2009-02-27  
dlovek 写道
andyhu1007 写道
dlovek 写道
andyhu1007 写道

字符串编码迷思:

 

new String(input.getBytes("ISO-8859-1"), "GB18030")
 

上面这段代码代表什么?有人会说: “把input字符串从ISO-8859-1编码方式转换成GB18030编码方式”。如果这种说法正确,那么又如何解释我们刚提到的java字符串都采用unicode编码呢?

 

这种说法不仅是欠妥的,而且是大错特错的,让我们一一来分析,其实事实是这样的:我们本应该用GB18030的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码,导致生成一个错误的字符串。要恢复,就要先把字符串恢复成原始字节数组,然后通过正确的编码GB18030再次解码成字符串(即把以GB18030编码的数据转成unicode的字符串)。注意,字符串永远都是unicode编码的。

 

但编码转换并不是负负得正那么简单,这里我们之所以可以正确地转换回来,是因为 ISO8859-1 是单字节编码,所以每个字节被按照原样 转换为 String ,也就是说,虽然这是一个错误的转换,但编码没有改变,所以我们仍然有机会把编码转换回来!

按我理解,new String(input.getBytes("GB18030"))同样可以转换成功?是这样吗?

 

不是,你这样理解是错误的。

 

自己理解下,从bytes 到 ISO-8859-1 编码的字符串,又用GB18030恢复成bytes,再用默认编码(可能并不是前两者)解码成字符串。是什么东东了阿。。。

不好意思,我还是没有理解。“我们本应该用GB18030的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码“,意思是说input中的byte[]是以GB180303编码,却我们解码时候错误使用了ISO-8859-1?

 

是~~~~~~~`

0 请登录后投票
   发表时间:2009-02-27  
andyhu1007 写道
dlovek 写道
andyhu1007 写道
dlovek 写道
andyhu1007 写道

字符串编码迷思:

 

new String(input.getBytes("ISO-8859-1"), "GB18030")
 

上面这段代码代表什么?有人会说: “把input字符串从ISO-8859-1编码方式转换成GB18030编码方式”。如果这种说法正确,那么又如何解释我们刚提到的java字符串都采用unicode编码呢?

 

这种说法不仅是欠妥的,而且是大错特错的,让我们一一来分析,其实事实是这样的:我们本应该用GB18030的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码,导致生成一个错误的字符串。要恢复,就要先把字符串恢复成原始字节数组,然后通过正确的编码GB18030再次解码成字符串(即把以GB18030编码的数据转成unicode的字符串)。注意,字符串永远都是unicode编码的。

 

但编码转换并不是负负得正那么简单,这里我们之所以可以正确地转换回来,是因为 ISO8859-1 是单字节编码,所以每个字节被按照原样 转换为 String ,也就是说,虽然这是一个错误的转换,但编码没有改变,所以我们仍然有机会把编码转换回来!

按我理解,new String(input.getBytes("GB18030"))同样可以转换成功?是这样吗?

 

不是,你这样理解是错误的。

 

自己理解下,从bytes 到 ISO-8859-1 编码的字符串,又用GB18030恢复成bytes,再用默认编码(可能并不是前两者)解码成字符串。是什么东东了阿。。。

不好意思,我还是没有理解。“我们本应该用GB18030的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码“,意思是说input中的byte[]是以GB180303编码,却我们解码时候错误使用了ISO-8859-1?

 

是~~~~~~~`

new String(input.getBytes("GB18030"),"GB18030"),这样对了吧?

0 请登录后投票
   发表时间:2009-02-27  
dlovek 写道
andyhu1007 写道
dlovek 写道
andyhu1007 写道
dlovek 写道
andyhu1007 写道

字符串编码迷思:

 

new String(input.getBytes("ISO-8859-1"), "GB18030")
 

上面这段代码代表什么?有人会说: “把input字符串从ISO-8859-1编码方式转换成GB18030编码方式”。如果这种说法正确,那么又如何解释我们刚提到的java字符串都采用unicode编码呢?

 

这种说法不仅是欠妥的,而且是大错特错的,让我们一一来分析,其实事实是这样的:我们本应该用GB18030的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码,导致生成一个错误的字符串。要恢复,就要先把字符串恢复成原始字节数组,然后通过正确的编码GB18030再次解码成字符串(即把以GB18030编码的数据转成unicode的字符串)。注意,字符串永远都是unicode编码的。

 

但编码转换并不是负负得正那么简单,这里我们之所以可以正确地转换回来,是因为 ISO8859-1 是单字节编码,所以每个字节被按照原样 转换为 String ,也就是说,虽然这是一个错误的转换,但编码没有改变,所以我们仍然有机会把编码转换回来!

按我理解,new String(input.getBytes("GB18030"))同样可以转换成功?是这样吗?

 

不是,你这样理解是错误的。

 

自己理解下,从bytes 到 ISO-8859-1 编码的字符串,又用GB18030恢复成bytes,再用默认编码(可能并不是前两者)解码成字符串。是什么东东了阿。。。

不好意思,我还是没有理解。“我们本应该用GB18030的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码“,意思是说input中的byte[]是以GB180303编码,却我们解码时候错误使用了ISO-8859-1?

 

是~~~~~~~`

new String(input.getBytes("GB18030"),"GB18030"),这样对了吧?

我不能误导你说“对”。但我也想不出办法给你解释了。文章里面讲得很清楚,请再仔细琢磨下:)

0 请登录后投票
   发表时间:2009-02-27   最后修改:2009-02-27
andyhu1007 写道
dlovek 写道
andyhu1007 写道
dlovek 写道
andyhu1007 写道
dlovek 写道
andyhu1007 写道

字符串编码迷思:

 

new String(input.getBytes("ISO-8859-1"), "GB18030")
 

上面这段代码代表什么?有人会说: “把input字符串从ISO-8859-1编码方式转换成GB18030编码方式”。如果这种说法正确,那么又如何解释我们刚提到的java字符串都采用unicode编码呢?

 

这种说法不仅是欠妥的,而且是大错特错的,让我们一一来分析,其实事实是这样的:我们本应该用GB18030的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码,导致生成一个错误的字符串。要恢复,就要先把字符串恢复成原始字节数组,然后通过正确的编码GB18030再次解码成字符串(即把以GB18030编码的数据转成unicode的字符串)。注意,字符串永远都是unicode编码的。

 

但编码转换并不是负负得正那么简单,这里我们之所以可以正确地转换回来,是因为 ISO8859-1 是单字节编码,所以每个字节被按照原样 转换为 String ,也就是说,虽然这是一个错误的转换,但编码没有改变,所以我们仍然有机会把编码转换回来!

按我理解,new String(input.getBytes("GB18030"))同样可以转换成功?是这样吗?

 

不是,你这样理解是错误的。

 

自己理解下,从bytes 到 ISO-8859-1 编码的字符串,又用GB18030恢复成bytes,再用默认编码(可能并不是前两者)解码成字符串。是什么东东了阿。。。

不好意思,我还是没有理解。“我们本应该用GB18030的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码“,意思是说input中的byte[]是以GB180303编码,却我们解码时候错误使用了ISO-8859-1?

 

是~~~~~~~`

new String(input.getBytes("GB18030"),"GB18030"),这样对了吧?

我不能误导你说“对”。但我也想不出办法给你解释了。文章里面讲得很清楚,请再仔细琢磨下:)

删了

0 请登录后投票
   发表时间:2009-10-16  
new String(input.getBytes("ISO-8859-1"), "UTF-8")
如input为读取文件a.txt包含中文的内容,经过测试,以上语句只有满足
1, a.txt使用UTF-8编码
2, JVM的编码为ISO-8859-1,即Charset.defaultCharset()=ISO-8859-1
中文内容显示正常,但对编码问题大家还是可以多多发表自己的看法。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics