gb2312----> utf-8

本文提供了一段Java代码用于将GB2312编码转换为UTF-8编码,并详细介绍了UTF-8编码原理及其变长字节特性。

朋友让我帮他写个gb2312->utf-8的字符转换程序,找了半天没有在网上找到合适的,于是自己动手写了一个,呵呵。把它贴在这里,免得以后忘记了 ^_^

实现思路大致如下:

  • 取得一个汉字的Unicode码
  • 把Unicode码分解为两个16进制数据字符串(丢弃前两个字节)
  • 把这两个16进制数据字符串转换成二进制数据字符串
  • 把二进制数据字符串分解为三个串,第一个串为4(0~4)个位,在高位加上标记位“1110”,第二(4~10)、三个(10~16)串均为6个位,分别在高位加上“10”标记位
  • 把这三个二进制串分别转换为10进制数据并赋值给字节型数组
  • 根据这个字节型数组构造UTF-8字符
java 代码
  1. importjava.io.File;
  2. importjava.io.FileOutputStream;
  3. importjava.io.UnsupportedEncodingException;
  4. /**
  5. *2007-8-10jyinatgomezdotcom
  6. */
  7. publicclassCharsetConvertor{
  8. publicstaticvoidmain(String[]args){
  9. Stringstr="Thisisatestfor*中网!@#$。,?";
  10. try{
  11. Filef=newFile("D:/test.txt");
  12. FileOutputStreamfio=newFileOutputStream(f);
  13. Strings=gbToUtf8(str);
  14. fio.write(s.getBytes("UTF-8"));
  15. fio.close();
  16. }
  17. catch(Exceptione){
  18. e.printStackTrace();
  19. }
  20. }
  21. publicstaticStringgbToUtf8(Stringstr)throwsUnsupportedEncodingException{
  22. StringBuffersb=newStringBuffer();
  23. for(inti=0;i<str.length();i++){
  24. Strings=str.substring(i,i+1);
  25. if(s.charAt(0)>0x80){
  26. byte[]bytes=s.getBytes("Unicode");
  27. StringbinaryStr="";
  28. for(intj=2;j<bytes.length;j+=2){
  29. //thefirstbyte
  30. StringhexStr=getHexString(bytes[j+1]);
  31. StringbinStr=getBinaryString(Integer.valueOf(hexStr,16));
  32. binaryStr+=binStr;
  33. //thesecondbyte
  34. hexStr=getHexString(bytes[j]);
  35. binStr=getBinaryString(Integer.valueOf(hexStr,16));
  36. binaryStr+=binStr;
  37. }
  38. //convertunicodetoutf-8
  39. Strings1="1110"+binaryStr.substring(0,4);
  40. Strings2="10"+binaryStr.substring(4,10);
  41. Strings3="10"+binaryStr.substring(10,16);
  42. byte[]bs=newbyte[3];
  43. bs[0]=Integer.valueOf(s1,2).byteValue();
  44. bs[1]=Integer.valueOf(s2,2).byteValue();
  45. bs[2]=Integer.valueOf(s3,2).byteValue();
  46. Stringss=newString(bs,"UTF-8");
  47. sb.append(ss);
  48. }else{
  49. sb.append(s);
  50. }
  51. }
  52. returnsb.toString();
  53. }
  54. privatestaticStringgetHexString(byteb){
  55. StringhexStr=Integer.toHexString(b);
  56. intm=hexStr.length();
  57. if(m<2){
  58. hexStr="0"+hexStr;
  59. }else{
  60. hexStr=hexStr.substring(m-2);
  61. }
  62. returnhexStr;
  63. }
  64. privatestaticStringgetBinaryString(inti){
  65. StringbinaryStr=Integer.toBinaryString(i);
  66. intlength=binaryStr.length();
  67. for(intl=0;l<8-length;l++){
  68. binaryStr="0"+binaryStr;
  69. }
  70. returnbinaryStr;
  71. }
  72. }

参见java.util.Properties。

用java程序将GBK字符转成UTF-8编码格式 (转)

原地址:http://blog.youkuaiyun.com/wangjichen_1/archive/2006/08/04/1019830.aspx

上网查找一下用java程序将GBK字符转成UTF-8编码格式的代码,发现全是C++ 写的,而且很烦琐,

现在自己写了一个java的,以供参考。

UTF-8 编码介绍
UTF-8 编码是一种被广泛应用的编码,这种编码致力于把全球的语言纳入一个统一的编码,
目前已经将几种亚洲语言纳入。UTF 代表 UCS Transformation Format.
UTF-8 采用变长度字节来表示字符,理论上最多可以到 6 个字节长度。
UTF-8 编码兼容了 ASC II(0-127), 也就是说 UTF-8 对于 ASC II 字符的编码是和 ASC II 一样的。
对于超过一个字节长度的字符,才用以下编码规范:
左边第一个字节1的个数表示这个字符编码字节的位数,
例如两位字节字符编码样式为为:110xxxxx 10xxxxxx;
三位字节字符的编码样式为:1110xxxx 10xxxxxx 10xxxxxx.;
以此类推,六位字节字符的编码样式为:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx。
xxx 的值由字符编码的二进制表示的位填入。只用最短的那个足够表达一个字符编码的多字节串。
例如:
Unicode 字符: 00 A9(版权符号) = 1010 1001,
UTF-8 编码为:11000010 10101001 = 0x C2 0xA9;
字符 22 60 (不等于符号) = 0010 0010 0110 0000,
UTF-8 编码为:11100010 10001001 10100000 = 0xE2 0x89 0xA0

package com.lang.string;


public class ConverFromGBKToUTF8 {
public static void main(String[] args){

try {

ConverFromGBKToUTF8 convert = new ConverFromGBKToUTF8();
byte [] fullByte = convert.gbk2utf8(chenese);
String fullStr = new String(fullByte, "UTF-8");
System.out.println("string from GBK to UTF-8 byte: " + fullStr);

} catch (Exception e) {
e.printStackTrace();
}
}

public byte[] gbk2utf8(String chenese){
char c[] = chenese.toCharArray();
byte [] fullByte =new byte[3*c.length];
for(int i=0; i<c.length; i++){
int m = (int)c[i];
String word = Integer.toBinaryString(m);
// System.out.println(word);

StringBuffer sb = new StringBuffer();
int len = 16 - word.length();
//补零
for(int j=0; j<len; j++){
sb.append("0");
}
sb.append(word);
sb.insert(0, "1110");
sb.insert(8, "10");
sb.insert(16, "10");

// System.out.println(sb.toString());

String s1 = sb.substring(0, 8);
String s2 = sb.substring(8, 16);
String s3 = sb.substring(16);

byte b0 = Integer.valueOf(s1, 2).byteValue();
byte b1 = Integer.valueOf(s2, 2).byteValue();
byte b2 = Integer.valueOf(s3, 2).byteValue();
byte[] bf = new byte[3];
bf[0] = b0;
fullByte[i*3] = bf[0];
bf[1] = b1;
fullByte[i*3+1] = bf[1];
bf[2] = b2;
fullByte[i*3+2] = bf[2];

}
return fullByte;
}
}

UTF-8的编码原理和特性:


U+0000~U+007E 1 _ _ _ _ _ _ _ (7bits)

U+0080~U+07FF 1 1 0_ _ _ _ _ 1 0_ _ _ _ _ _ (11bits)

U+0800~U+FFFF 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ (16bits)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值