锁定老帖子 主题:对编码问题的总结(java版)
精华帖 (0) :: 良好帖 (7) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-11-06
最后修改:2010-11-10
总结下这两天对编码的认识一些认识,本文显得比较啰嗦,应为这是我探讨的整个流程结果,了解的有不对的地方多多指点出来!
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; public class Charset { public static void main(String[] str) { System.out.println(System.getProperty("file.encoding")); FileInputStream fis01; FileInputStream fis02; FileInputStream fis03; InputStreamReader isrUTF8; InputStreamReader isrGBK; BufferedReader brUTF8; BufferedReader brGBK; try { fis01 = new FileInputStream("E:\\试一下.txt"); fis02 = new FileInputStream("E:\\试一下.txt"); fis03 = new FileInputStream("E:\\试一下.txt"); isrGBK = new InputStreamReader(fis02, "GBK"); isrUTF8 = new InputStreamReader(fis01, "UTF-8"); brGBK = new BufferedReader(isrGBK); brUTF8 = new BufferedReader(isrUTF8); int t = 0; String strGBK = brGBK.readLine(); String strUTF8 = brUTF8.readLine(); System.out.println("GBK的字节-----"); byte[] b = strGBK.getBytes(); for (int i = 0; i < b.length; i++) { System.out.println(b[i]); } System.out.println("-----"); System.out.println("utf-8的字节-----"); byte[] c = strUTF8.getBytes(); for (int i = 0; i < c.length; i++) { System.out.println(c[i]); } System.out.println("-----"); System.out.println("直接读取的字节-----"); byte[] y = new byte[b.length]; int f = fis03.read(y); for (int d = 0; d < y.length; d++) { System.out.println(y[d]); } System.out.println("-----"); System.out.println("GBK:" + strGBK); System.out.println("UTF-8:" + strUTF8); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
很简单的一个程序,结果为 GBK GBK的字节----- -63 -84 -51 -88 红色的这两段字,都为自己理解,第一句更是自己的猜想理解,(事实肯定不是这样,让自己好记点,呵呵)想具体认识,查看些官方类文旦。 现在就纠正下上面红色的概念问题:
Unicode是为整合全世界的所有语言文字而诞生的。任何文字在Unicode中都对应一个值,这个值称为代码点(code point)。代码点的值通常写成 U+ABCD 的格式。而文字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。顾名思义,UCS-2是用两个字节来表示代码点,其取值范围为 U+0000~U+FFFF。 为了能表示更多的文字,人们又提出了UCS-4,即用四个字节表示代码点。它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的。 要注意,UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。规定存储方式的称为UTF(Unicode Transformation Format),其中应用较多的就是UTF-16和UTF-8了。
主要上文主要说的unicode编码主要是说:java中的string.getByte("unicode")出来的是utf-16,呵呵。 这段话可以帮助理解:Windows平台下默认的Unicode编码为Little Endian的UTF-16.
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-11-06
最后修改:2010-11-06
支持&收藏,与LZ来自同一个城市。
|
|
返回顶楼 | |
发表时间:2010-11-07
支持. 与LZ来之同一星球
|
|
返回顶楼 | |
发表时间:2010-11-07
IcyFenix 写道 支持&收藏,与LZ来自同一个城市。
呀,不知道在哪个区工作啦~ |
|
返回顶楼 | |
发表时间:2010-11-07
marauder 写道
如图运行过程如图: 中间的那个byte[] 不=63 63 好像少了个63 ,最右边的byte[]b = 63 -84 -51 -88也少了个在下面一行呀。 支持,收藏。 |
|
返回顶楼 | |
发表时间:2010-11-07
楼主动手深入分析的精神小弟佩服.先留着,后续慢慢看.
|
|
返回顶楼 | |
发表时间:2010-11-07
codermouse 写道 楼主动手深入分析的精神小弟佩服.先留着,后续慢慢看.
写得很啰嗦,就是因为网上找了些的资料,但不确定内存那部分存的是什么,所以把整个运行过程给虚拟出来。 希望多多交流,有错误,或是描述不够正确请指正。 |
|
返回顶楼 | |
发表时间:2010-11-07
wuyanlong 写
中间的那个byte[] 不=63 63 好像少了个63 ,最右边的byte[]b = 63 -84 -51 -88也少了个在下面一行呀。 支持,收藏。
编程很多时候需要细心,谢谢,以后会注意 希望多多交流,有错误,或是描述不够正确请指正。 |
|
返回顶楼 | |
发表时间:2010-11-07
unicode是一种字符集.与GB2312,GBK是同概念的.就是一种代码表.
而utf-8,utf-16这些不是字符集,而是用来表达unicode字符的数据格式.utf-8最大的特点是变长,这样对于英文语言国家来说,从iso8859-1转为utf-8后,字符串的尺寸增加也不是很大. 另外,说到编码,一方面要注意字符编码,同样还要注意文件编码概念.也就是可能出现文件编码声明为ASNI,而存储的字符内容为GBK之类的情况. 然后,对于UTF-8格式的文件,最烦心的是BOM头问题... 总之,我的心得体会是,不管总结多少次,编码问题总还是会成为问题... ... |
|
返回顶楼 | |
发表时间:2010-11-07
会思考才能立于不败之地,果断收藏
|
|
返回顶楼 | |