有没有做过Java的UTF-8编码转GBK的方法,高分求

clz1314521 2010-11-02 10:34:56
有没有做过Java的UTF-8编码转GBK?
我遇到一个问题要将UTF-8编码转GBK。在网上一直没有找到,找来找去只找到一个GBK2utf-8方法。
大家有没有人写过,请赐教。谢谢 高分谢谢
首先说下
new String(tmp.getBytes("ISO-8859-1"), "UTF-8")
或者 new String(tmp.getBytes("ISO-8859-1"), "GBK")
new String(tmp.getBytes("GBK"), "UTF-8") 这些方法是解决不了的。
我在网上找到的Gbk2Utf8的方法,大家谁能按照这个写个反向的??

---------------------------------------------------
public class CharacterEncodeConverter {


public static void main(String[] args) {



try {

CharacterEncodeConverter convert = new CharacterEncodeConverter();

byte[] fullByte = convert.gbk2utf8("中文");

String fullStr = new String(fullByte, "UTF-8");

System.out.println("string from GBK to UTF-8 byte: " + fullStr);



} catch (Exception e) {

e.printStackTrace();

}

}



/** *//**

* Gbk2utf8.

*

* @param chenese the chenese

*

* @return the byte[]

*/

public byte[] gbk2utf8(String chenese) {



// Step 1: 得到GBK编码下的字符数组,一个中文字符对应这里的一个c

char c[] = chenese.toCharArray();



// Step 2: UTF-8使用3个字节存放一个中文字符,所以长度必须为字符的3 倍

byte[] fullByte = new byte[3 * c.length];



// Step 3: 循环将字符的GBK编码转换成UTF-8编码

for (int i = 0; i < c.length; i++) {



// Step 3-1:将字符的ASCII编码转换成2进制值

int m = (int) c;

String word = Integer.toBinaryString(m);

System.out.println(word);



// 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");

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



// 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:返回继续解析下一个中文字符

}

return fullByte;

}

}

最终的测试结果是正确的:string from GBK to UTF-8 byte: 中文。
...全文
824 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
clz1314521 2010-11-16
  • 打赏
  • 举报
回复
界贴了,虽然没有答案,,感谢大家关注
  • 打赏
  • 举报
回复
其实楼主说的本来就很不明确,怎么叫UTF-8转GBK呢?
是源文件本身编码方式的转变还是字符串的的转码?
字符串的转码我就不啰嗦了
源文件本身的转码可以在MyEclipse里面进行,MyEclipse有这个功能,强制把xx类型的页面用xx格式编码。
yaoweijq 2010-11-03
  • 打赏
  • 举报
回复
java.net.URLEncoder
java.net.URLDecoder
这两个类应该就够用了
龙心 2010-11-03
  • 打赏
  • 举报
回复
感觉没有充分理解楼主的需求,楼主能否将需求再补充一下,我也想学习一下,谢谢。
clz1314521 2010-11-03
  • 打赏
  • 举报
回复
找到一个VC和C的UTf-8转GBK的源码,
http://hi.baidu.com/snacky/blog/item/c1e7de13857f05075baf5325.html

至今还没找到Java的。期待达人出现,解决这个问题。
贴个思路给大家。
朋友让我帮他写个gb2312->utf-8的字符转换程序,找了半天没有在网上找到合适的,于是自己动手写了一个,呵呵。把它贴在这里,免得以后忘记了 ^_^

实现思路大致如下:

取得一个汉字的Unicode码
把Unicode码分解为两个16进制数据字符串(丢弃前两个字节)
把这两个16进制数据字符串转换成二进制数据字符串
把二进制数据字符串分解为三个串,第一个串为4(0~4)个位,在高位加上标记位“1110”,第二(4~10)、三个(10~16)串均为6个位,分别在高位加上“10”标记位
把这三个二进制串分别转换为10进制数据并赋值给字节型数组
根据这个字节型数组构造UTF-8字符

UTF-8转GBK应该是按这个思路反向转。
clz1314521 2010-11-03
  • 打赏
  • 举报
回复
代码没有特殊的地方,我晚上回家发下。我已经抓过包了,接口那边收到的确定是正常的utf8中文,我现在就是想把他转成Gbk。这样问题,我应该不是第一个遇到的,请处理过的人赐教。我应该说的够清楚了吧?谢谢
magong 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 clz1314521 的回复:]

我是通过Webservice调对方接口,我现在Action中得到的是正确 utf8中文,但是我要将其转成gbk的中文去调对方接口。
[/Quote]
把调用的相关代码贴出来吧。
clz1314521 2010-11-03
  • 打赏
  • 举报
回复
楼上可以写个测试方法跑下,看看得到是不是?,一个正常的Utf8是三个字节转成Gbk,肯定要拆成二进制进行转换的。
xuyang840117 2010-11-03
  • 打赏
  • 举报
回复
new String(tmp.getBytes("UTF-8"), "GBK")

如果正确的UTF-8 那这个应该可以啊
确定吗
clz1314521 2010-11-03
  • 打赏
  • 举报
回复
我是通过Webservice调对方接口,我现在Action中得到的是正确 utf8中文,但是我要将其转成gbk的中文去调对方接口。
xuyang840117 2010-11-03
  • 打赏
  • 举报
回复
new String(tmp.getBytes("GBK"), "ISO-8859-1")

这呢
magong 2010-11-03
  • 打赏
  • 举报
回复
比方说OutputStream吧,你这样做
//OutputStream os;
os.write("要传的中文字符串".getBytes("GBK"));
magong 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 clz1314521 的回复:]

我Web utf-8后台收到的也是Utf-8,我现在要掉对方一个接口,对方让我将编码转成Gbk.这样应该清楚了吧?页面编码是不能改的。那个方法是发给大家仓考的。期待大家知道的能告诉下,多谢
[/Quote]
不清楚。你怎么调对方接口的,Web?直接传字节流?这是关键。
dingwood 2010-11-03
  • 打赏
  • 举报
回复
貌似楼上的方法可以。。。
soli11722984 2010-11-03
  • 打赏
  • 举报
回复

String str = "中";// 这里默认是UTF-8
byte[] b = str.getBytes("GBK");
System.out.println(new String(b,"GBK"));
clz1314521 2010-11-03
  • 打赏
  • 举报
回复
我Web utf-8后台收到的也是Utf-8,我现在要掉对方一个接口,对方让我将编码转成Gbk.这样应该清楚了吧?页面编码是不能改的。那个方法是发给大家仓考的。期待大家知道的能告诉下,多谢
magong 2010-11-02
  • 打赏
  • 举报
回复
不好意思,没太看懂你的需求。
你给的代码不能通过编译。
改了一处错误后能跑了,但是发现,这个代码根本没什么意思。比方说,将你main方法中的这行代码
[Quote=引用楼主 clz1314521 的回复:]
byte[] fullByte = convert.gbk2utf8("中文");
[/Quote]
改成
byte[] fullByte = "中文".getBytes("UTF-8");
程序运行结果不受影响。那这个程序这么多代码,不就是个getBytes("UTF-8")就能完成的功能么?
你说的逆向转换,是什么意思?
liushulaoshu 2010-11-02
  • 打赏
  • 举报
回复
new String(tmp.getBytes("ISO-8859-1"), "GBK") 这个都不行吗??如果你是web的话 看看你的页面设置以及数据库设置,还是不行的话 尝试着用post传值的方式看看,还是不行,看看你的浏览器的编码方式是什么方式,水平有限,期待高手

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧