bufegar 2007-4-6 14:01
utfToGBK
平时如果用GBK在很多地方不对被支持(不是乱码,只是外码显示不支持),比如生成图片你就不能直接drawString("中文");要转换成UTF,那个gbToUtf8()方法我已经介绍过多次了.
但昨天遇到了一个问题,就是源文件是UTF的,要转换成GB2312,这种情况其实也很多,比如我们访问的WEB页面是utf字符集,这时我们一定要手工把浏览器字符集设为UTF才正常.那么如果把UTF直接转换成GB2312的编码,在网上穷找了N小时没有任何资料,没办法,自己动手吧.
每个UTF字符,如果值在0x0001到0x007F这间就是一个byte,在0x007F互0x07FF之间就是两个
byte,如果大于0x07FF就是三个byte,所以汉字都是三个byte,但我们不有把得到的byte每三个进行一次转换,因为有可能是中文,英文,标点混在一起的,所以要计算值,特烦.
[java]
public static byte[] utfToGBK(byte[] srcByte,String encoding) throws UTFDataFormatException{
StringBuffer str = new StringBuffer();
int len = srcByte.length;
int char1, char2, char3;
int count = 0;
while (count < len) {
char1 = (int) srcByte[count] & 0xff;
switch (char1 >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
count++;
str.append( (char) char1);
break;
case 12:
case 13:
count += 2;
if (count > len) {
throw new UTFDataFormatException();
}
char2 = (int) srcByte[count - 1];
if ( (char2 & 0xC0) != 0x80) {
throw new UTFDataFormatException();
}
str.append( (char) ( ( (char1 & 0x1F) << 6) | (char2 & 0x3F)));
break;
case 14:
/* 1110 xxxx 10xx xxxx 10xx xxxx */
count += 3;
if (count > len) {
throw new UTFDataFormatException();
}
char2 = (int) srcByte[count - 2];
char3 = (int) srcByte[count - 1];
if ( ( (char2 & 0xC0) != 0x80) || ( (char3 & 0xC0) != 0x80)) {
throw new UTFDataFormatException();
}
str.append( (char) ( ( (char1 & 0x0F) << 12) |
( (char2 & 0x3F) << 6) |
( (char3 & 0x3F) << 0)));
break;
default:
throw new UTFDataFormatException();
}
}
String temp = new String(str);
try{
if(encoding==null) encoding = "GBK";
return temp.getBytes(encoding);
}catch(Exception e){
return null;
}
}
[/java]
好了,现在如果你从UTF文件或其它的UTF流中读到byte后可以直接得到指定的字符集的BYTE了.如果要返回String,直接new String(byte[])就行了,我没有直接返回String,是因为有人会直接从StringBuffer那一步new String,这不行,这时内存中的编码还是UNCODE的,要getBytes("GBK")得到的才是你要的byte.