日期:2014-05-20  浏览次数:20627 次

关于java汉文编码的一些小问题
一直以来都被字符集的编码嗦迷惑,只是有的时候想到其他办法绕开了。如今面临着更大的挑战,也只有硬着头皮上了,


关于中文编码,我有很多不明白的地方:

①java String有一个构造器为:String(byte[] bytes, Charset charset) 
有一个方法为:public byte[] getBytes(String charsetName);

我有一事不明:
new String (t.getBytes("charsetName1") , "charsetName2");
以charsetName1获取原String的byte数组,再以charsetName2重编码.
那么就必须要求charsetName1是charsetName2的一个子集(大概意思是这个样子的:比如汉字"啊",其gb2312编码为0x00(假如),要想用GBK重编码,必须要求GBK中汉字"啊"的字符集也是0x00才可以)
而问题在于,除了编码们对ASCII全面兼容以外,各国对其他国家的编码都不算完全兼容。

对于一个未知的编码,怎么将其转化为另一个编码(如GBK或者UTF-8)

②java String 对getBytes是这么描述的:
public byte[] getBytes(Charset charset)
使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。

我又有一事不明:
比如汉字:"中文",GB2312以"0xD6D00xCEC4" 储存,转化成字节就是
d6 d0 ce c4.明显 d6>127 了转化为字节数组的时候不是得溢出么,还怎么再存放???求解!

------解决方案--------------------
比如汉字:"中文",GB2312以"0xD6D00xCEC4" 储存,转化成字节就是
d6 d0 ce c4.明显 d6>127 了转化为字节数组的时候不是得溢出么,还怎么再存放???求解!

个人浅见:
转换成字节是:
-42,-48,-50,-60。
因为java的byte类型是有符号数。二进制表示时就是 11010110,110110000,11001110,11000100,你要是把他按int型看就是d6,d0,ce,c4.