java中怎样将GB2312的中文转换成utf-8编码

java中怎样将GB2312的中文转换成utf-8编码,第1张

String tempStr="中文";//准备转换的字符
String result=new String(tempStrgetBytes("GB2312"),"UTF-8");//转换后的结果

java 很方便进行这种转换
如果输入是UTF8的字节
String s=new String(utf8_bytes, "UTF-8"); //utf8_bytes为byte[]类型
如果输入是字符串,直接
String s=原返回。

在输出是转换gb18030,不输出时不用转换。
oswrite(sgetBytes("GB18030")); //os为输出流

java中,编码是字节转字符的时候产生的不同映射造成的差异。那我们就可以利用这一点实现。例如,我们有一个gbk编码格式的字符串,那我们先把它的字节得到。
String s = "abc";
byte[] b = sgetBytes();
再将其转为需要的编码格式。如utf-8
String newStr = new String(b,"utf-8")
binggo~!!

首先明确几点:
unicode是一种“编码”,所谓编码就是一个编号(数字)到字符的一种映射关系,就仅仅是一种一对一的映射而已,可以理解成一个很大的对应表格
GBK、
UTF-8是一种“编码格式”,是用来序列化或存储1中提到的那个“编号(数字)”的一种“格式”;GBK和UTF-8都是用来序列化或存储
unicode编码的数据的,但是分别是2种不同的格式;
他们俩除了格式不一样之外,他们所关心的unicode编码范围也不一样,utf-8考虑了很多种不同国家的字符,涵盖整个unicode码表,所以其存
储一个字符的编码的时候,使用的字节长度也从1字节到4字节不等;而GBK只考虑中文——在unicode中的一小部分——的字符,的编码,所以它算好了
只要2个字节就能涵盖到绝大多数常用中文(2个字节能表示6w多种字符),所以它存储一个字符的时候,所用的字节长度是固定的;
上述2个概念不懂的请马上google,下面不再赘述;我下面说说这个问题本身的问题在哪里

先java的string使用的编码是unicode,但是,当string存在于内存中时(也就是当程序运行时、你在代码中用string类型的引用对
它进行 *** 作时、也就是string没有被存在文件中且也没有在网络中传输(序列化)时),是“只有编码而没有编码格式的”,所以java程序中的任何
String对象,说它是gbk还是utf-8都是错的,gbk和utf-8是编码格式而不是编码,String在内存中不需要“编码格式”(记住编码格
式是在存文件或序列化的时候使用的), 它只是一个unicode的字符串而已
所以java里面String是不带编码格式的,而
StringtoByteArray(charsetName)得到的byteArray是带编码格式的,格式就是你传入的
'charsetName',我们不妨把toByteArray的这个过程叫做“编码”;另外,new String(byte[],
charsetName)是把一个byte数组(带编码格式)以charsetName指定的编码格式翻译为一个不带编码格式的String对象,我们不
妨把这个过程叫“解码”
那么根据我揣测提问者的意图,可能有2种问法是他真正想问的:
第一,如何把一个被错误地当作是gbk格式存储的utf-8格式的文件里面读出来的一段乱码字符串还原回去(也就是说本来二进制数据是utf-8的,你用gbk来解码它,得到的字符串是乱码,现在想要还原回去)
第二种,如何把一个gbk文件转化为utf-8文件
如果是第一种意图那就:
public static void main(String args) throws Throwable {
String errStr = "errStr";
Systemoutprintln(recover(errStr));
}
public static String recover(String str) throws Throwable {
return new String(strgetBytes("GBK"), "UTF-8");
}
其中errStr就是乱码字符串,按照相反的顺序在编码(用gbk)、解码(用utf-8)回去,就能得到正确的字符串(其实不保证所有情况均能正确还原,只能说大部分都能,要看你在乱码过程中是否有数据被丢失)
如果是第二种意图,那就用InputStream以gbk格式将文件读到内存里(表示为String),再将这个String以UTF-8编码写入目标文件里,具体请参考InputStream/OutputStream的api

byte[] b=new byte[]{65,66,67,68};//字节数组
        String s=new String(b,"ascii");//第二个参数指定编码方式
        Systemoutprint(s);


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12602759.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存