将 GBK编码的中文 转换成 UTF-8编码的中文
2011-10-20 12:40
471 查看
public class CharacterCodeConversion {
public static String srcCharacter = "UTF-8";
public static String targetCharacter = "UTF-8";
public static String transfor(String str) {
String returnString = null;
return returnString;
}
public static String gbk2utf8(String str)
throws UnsupportedEncodingException {
// Step 1: 得到GBK编码下的字符数组,一个中文字符对应这里的一个c
char c[] = str.toCharArray();
// Step 2: UTF-8使用3个字节存放一个中文字符,所以长度必须为字符的3 倍
byte[] fullByte = new byte[3 * c.length];
try {
// Step 3: 循环将字符的GBK编码转换成UTF-8编码
for (int i = 0; i < c.length; i++) {
int m = (int) c[i];
String word = Integer.toBinaryString(m);
// Step 3-2:将2进制值补足16位(2个字节的长度)
StringBuffer sb = new StringBuffer();
int len = 16 - word.length();
for (int j = 0; j < len; j++) {
sb.append("0");
}
// Step 3-3:得到该字符最终的2进制GBK编码
// 形似:1000 0010 0111 1010
sb.append(word);
// Step 3-4:最关键的步骤,根据UTF-8的汉字编码规则,首字节
// 以1110开头,次字节以10开头,第3字节以10开头。在原始的2进制
// 字符串中插入标志位。最终的长度从16--->16+3+2+2=24。
sb.insert(0, "1110");
sb.insert(8, "10");
sb.insert(16, "10");
// Step 3-5:将新的字符串进行分段截取,截为3个字节
String s1 = sb.substring(0, 8);
String s2 = sb.substring(8, 16);
String s3 = sb.substring(16);
// Step 3-6:最后的步骤,把代表3个字节的字符串按2进制的方式
// 进行转换,变成2进制的整数,再转换成16进制值
byte b0 = Integer.valueOf(s1, 2).byteValue();
byte b1 = Integer.valueOf(s2, 2).byteValue();
byte b2 = Integer.valueOf(s3, 2).byteValue();
// Step 3-7:把转换后的3个字节按顺序存放到字节数组的对应位置
byte[] bf = new byte[3];
bf[0] = b0;
bf[1] = b1;
bf[2] = b2;
fullByte[i * 3] = bf[0];
fullByte[i * 3 + 1] = bf[1];
fullByte[i * 3 + 2] = bf[2];
// Step 3-8:返回继续解析下一个中文字符
}
} catch (Exception e) {
e.printStackTrace();
}
String reStr = new String(fullByte,
CharacterCodeConversion.targetCharacter);
return reStr;
}
public static void main(String[] args) {
CharacterCodeConversion.srcCharacter = "GBK";
CharacterCodeConversion.targetCharacter = "UTF-8";
String str = "植物大战僵尸"; // 用GBK编码编译过的字符串
try {
String utf8_str = CharacterCodeConversion.gbk2utf8(str);
System.out.println("转换后的字符串:" + utf8_str);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String srcCharacter = "UTF-8";
public static String targetCharacter = "UTF-8";
public static String transfor(String str) {
String returnString = null;
return returnString;
}
public static String gbk2utf8(String str)
throws UnsupportedEncodingException {
// Step 1: 得到GBK编码下的字符数组,一个中文字符对应这里的一个c
char c[] = str.toCharArray();
// Step 2: UTF-8使用3个字节存放一个中文字符,所以长度必须为字符的3 倍
byte[] fullByte = new byte[3 * c.length];
try {
// Step 3: 循环将字符的GBK编码转换成UTF-8编码
for (int i = 0; i < c.length; i++) {
int m = (int) c[i];
String word = Integer.toBinaryString(m);
// Step 3-2:将2进制值补足16位(2个字节的长度)
StringBuffer sb = new StringBuffer();
int len = 16 - word.length();
for (int j = 0; j < len; j++) {
sb.append("0");
}
// Step 3-3:得到该字符最终的2进制GBK编码
// 形似:1000 0010 0111 1010
sb.append(word);
// Step 3-4:最关键的步骤,根据UTF-8的汉字编码规则,首字节
// 以1110开头,次字节以10开头,第3字节以10开头。在原始的2进制
// 字符串中插入标志位。最终的长度从16--->16+3+2+2=24。
sb.insert(0, "1110");
sb.insert(8, "10");
sb.insert(16, "10");
// Step 3-5:将新的字符串进行分段截取,截为3个字节
String s1 = sb.substring(0, 8);
String s2 = sb.substring(8, 16);
String s3 = sb.substring(16);
// Step 3-6:最后的步骤,把代表3个字节的字符串按2进制的方式
// 进行转换,变成2进制的整数,再转换成16进制值
byte b0 = Integer.valueOf(s1, 2).byteValue();
byte b1 = Integer.valueOf(s2, 2).byteValue();
byte b2 = Integer.valueOf(s3, 2).byteValue();
// Step 3-7:把转换后的3个字节按顺序存放到字节数组的对应位置
byte[] bf = new byte[3];
bf[0] = b0;
bf[1] = b1;
bf[2] = b2;
fullByte[i * 3] = bf[0];
fullByte[i * 3 + 1] = bf[1];
fullByte[i * 3 + 2] = bf[2];
// Step 3-8:返回继续解析下一个中文字符
}
} catch (Exception e) {
e.printStackTrace();
}
String reStr = new String(fullByte,
CharacterCodeConversion.targetCharacter);
return reStr;
}
public static void main(String[] args) {
CharacterCodeConversion.srcCharacter = "GBK";
CharacterCodeConversion.targetCharacter = "UTF-8";
String str = "植物大战僵尸"; // 用GBK编码编译过的字符串
try {
String utf8_str = CharacterCodeConversion.gbk2utf8(str);
System.out.println("转换后的字符串:" + utf8_str);
} catch (Exception e) {
e.printStackTrace();
}
}
相关文章推荐
- 汉字编码(【Unicode】 【UTF-8】 【Unicode与UTF-8之间的转换】 【汉字 Unicode 编码范围】【中文标点Unicode码】【GBK编码】【批量获取汉字UNICODE码】)
- Python 中的编码转换 编码方案 中文解码 gbk , utf ,unicode
- UTF-8和GBK等中文字符编码格式介绍及相互转换
- 如何解决GBK的编码的文件中的中文转换成为UTF-8编码的文件而且不乱码
- PHP中文字符gbk编码与UTF-8编码的转换
- dedecms utf-8版本不支持中文字符,用iconv函数转编码进行转换
- 解决中文字符乱码问题,如何将gbk格式转换utf-8格式
- 字符编码——在python2中如何将txt中的utf-8转换成中文
- C++文件编码由GBK转换UTF-8的解决方法
- Android studio中将gbk转换为utf-8编码
- MyEclipse编码设置,中文乱码解决方法,UTF-8,GBK
- PHP转换编码问题GBK/UTF-8
- Unicode,ISO-8859,GBK,UTF-8编码及相互转换
- JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
- MyEclipse编码设置,中文乱码解决方法,UTF-8,GBK
- oracle编码格式从utf-8转换为GBK
- 有关编码(GBK、utf-8、iso8859-1、)相互转换问题
- WindowsPhone的中文GB2312、GBK编码与Unicode相互转换
- MyEclipse编码设置,中文乱码解决方法,UTF-8,GBK(转)