问题描述
有没有做过Java的UTF-8编码转GBK?我遇到一个问题要将UTF-8编码转GBK。在网上一直没有找到,找来找去只找到一个GBK2utf-8方法。大家有没有人写过,请赐教。谢谢高分谢谢首先说下newString(tmp.getBytes("ISO-8859-1"),"UTF-8")或者newString(tmp.getBytes("ISO-8859-1"),"GBK")newString(tmp.getBytes("GBK"),"UTF-8")这些方法是解决不了的。我在网上找到的Gbk2Utf8的方法,大家谁能按照这个写个反向的??---------------------------------------------------publicclassCharacterEncodeConverter{publicstaticvoidmain(String[]args){try{CharacterEncodeConverterconvert=newCharacterEncodeConverter();byte[]fullByte=convert.gbk2utf8("中文");StringfullStr=newString(fullByte,"UTF-8");System.out.println("stringfromGBKtoUTF-8byte:"+fullStr);}catch(Exceptione){e.printStackTrace();}}/***//***Gbk2utf8.**@paramchenesethechenese**@returnthebyte[]*/publicbyte[]gbk2utf8(Stringchenese){//Step1:得到GBK编码下的字符数组,一个中文字符对应这里的一个ccharc[]=chenese.toCharArray();//Step2:UTF-8使用3个字节存放一个中文字符,所以长度必须为字符的3倍byte[]fullByte=newbyte[3*c.length];//Step3:循环将字符的GBK编码转换成UTF-8编码for(inti=0;i<c.length;i++){//Step3-1:将字符的ASCII编码转换成2进制值intm=(int)c;Stringword=Integer.toBinaryString(m);System.out.println(word);//Step3-2:将2进制值补足16位(2个字节的长度)StringBuffersb=newStringBuffer();intlen=16-word.length();for(intj=0;j<len;j++){sb.append("0");}//Step3-3:得到该字符最终的2进制GBK编码//形似:1000001001111010sb.append(word);//Step3-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());//Step3-5:将新的字符串进行分段截取,截为3个字节Strings1=sb.substring(0,8);Strings2=sb.substring(8,16);Strings3=sb.substring(16);//Step3-6:最后的步骤,把代表3个字节的字符串按2进制的方式//进行转换,变成2进制的整数,再转换成16进制值byteb0=Integer.valueOf(s1,2).byteValue();byteb1=Integer.valueOf(s2,2).byteValue();byteb2=Integer.valueOf(s3,2).byteValue();//Step3-7:把转换后的3个字节按顺序存放到字节数组的对应位置byte[]bf=newbyte[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];//Step3-8:返回继续解析下一个中文字符}returnfullByte;}}
最终的测试结果是正确的:stringfromGBKtoUTF-8byte:中文。
解决方案
解决方案二:
newString(tmp.getBytes("ISO-8859-1"),"GBK")这个都不行吗??如果你是web的话看看你的页面设置以及数据库设置,还是不行的话尝试着用post传值的方式看看,还是不行,看看你的浏览器的编码方式是什么方式,水平有限,期待高手
解决方案三:
不好意思,没太看懂你的需求。你给的代码不能通过编译。改了一处错误后能跑了,但是发现,这个代码根本没什么意思。比方说,将你main方法中的这行代码引用楼主clz1314521的回复:
byte[]fullByte=convert.gbk2utf8("中文");
改成byte[]fullByte="中文".getBytes("UTF-8");程序运行结果不受影响。那这个程序这么多代码,不就是个getBytes("UTF-8")就能完成的功能么?你说的逆向转换,是什么意思?
解决方案四:
感觉没有充分理解楼主的需求,楼主能否将需求再补充一下,我也想学习一下,谢谢。
解决方案五:
java.net.URLEncoderjava.net.URLDecoder这两个类应该就够用了
解决方案六:
其实楼主说的本来就很不明确,怎么叫UTF-8转GBK呢?是源文件本身编码方式的转变还是字符串的的转码?字符串的转码我就不啰嗦了源文件本身的转码可以在MyEclipse里面进行,MyEclipse有这个功能,强制把xx类型的页面用xx格式编码。
解决方案七:
我Webutf-8后台收到的也是Utf-8,我现在要掉对方一个接口,对方让我将编码转成Gbk.这样应该清楚了吧?页面编码是不能改的。那个方法是发给大家仓考的。期待大家知道的能告诉下,多谢
解决方案八:
Stringstr="中";//这里默认是UTF-8byte[]b=str.getBytes("GBK");System.out.println(newString(b,"GBK"));
解决方案九:
貌似楼上的方法可以。。。
解决方案十:
引用6楼clz1314521的回复:
我Webutf-8后台收到的也是Utf-8,我现在要掉对方一个接口,对方让我将编码转成Gbk.这样应该清楚了吧?页面编码是不能改的。那个方法是发给大家仓考的。期待大家知道的能告诉下,多谢
不清楚。你怎么调对方接口的,Web?直接传字节流?这是关键。
解决方案十一:
比方说OutputStream吧,你这样做//OutputStreamos;os.write("要传的中文字符串".getBytes("GBK"));
解决方案十二:
newString(tmp.getBytes("GBK"),"ISO-8859-1")这呢
解决方案十三:
我是通过Webservice调对方接口,我现在Action中得到的是正确utf8中文,但是我要将其转成gbk的中文去调对方接口。
解决方案十四:
newString(tmp.getBytes("UTF-8"),"GBK")如果正确的UTF-8那这个应该可以啊确定吗
解决方案十五:
楼上可以写个测试方法跑下,看看得到是不是?,一个正常的Utf8是三个字节转成Gbk,肯定要拆成二进制进行转换的。
其他方案:
引用12楼clz1314521的回复:
我是通过Webservice调对方接口,我现在Action中得到的是正确utf8中文,但是我要将其转成gbk的中文去调对方接口。
把调用的相关代码贴出来吧。
其他方案:
代码没有特殊的地方,我晚上回家发下。我已经抓过包了,接口那边收到的确定是正常的utf8中文,我现在就是想把他转成Gbk。这样问题,我应该不是第一个遇到的,请处理过的人赐教。我应该说的够清楚了吧?谢谢
其他方案:
找到一个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应该是按这个思路反向转。
其他方案:
界贴了,虽然没有答案,,感谢大家关注