锁定老帖子 主题:Java编码浅析(注意区分三个概念)
精华帖 (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文件中的内容可能就出错了。 好象是通过文件的前几个字节来判断文件的编码方式 |
|
返回顶楼 | |
发表时间:2009-02-26
对于外部的编码,比如mysql数据的默认编码是latin1,那使用java环境发送sql中包含中文时,应该怎么做才不会乱码
|
|
返回顶楼 | |
发表时间: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"))同样可以转换成功?是这样吗? |
|
返回顶楼 | |
发表时间: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,再用默认编码(可能并不是前两者)解码成字符串。是什么东东了阿。。。 |
|
返回顶楼 | |
发表时间: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? |
|
返回顶楼 | |
发表时间: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?
是~~~~~~~` |
|
返回顶楼 | |
发表时间: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"),这样对了吧? |
|
返回顶楼 | |
发表时间: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"),这样对了吧? 我不能误导你说“对”。但我也想不出办法给你解释了。文章里面讲得很清楚,请再仔细琢磨下:) |
|
返回顶楼 | |
发表时间: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"),这样对了吧? 我不能误导你说“对”。但我也想不出办法给你解释了。文章里面讲得很清楚,请再仔细琢磨下:) 删了 |
|
返回顶楼 | |
发表时间: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 中文内容显示正常,但对编码问题大家还是可以多多发表自己的看法。 |
|
返回顶楼 | |