从 UTF-8 转 GBK失败

ilearn 2020-08-31 04:08:28
Java试从UTF-8 转 GBK 试过这些办法都失败了,网上的方法大多数试过,都不行

首先我尝试过检查String是什么编码的
Maven加这个
<dependency>
<groupId>com.googlecode.juniversalchardet</groupId>
<artifactId>juniversalchardet</artifactId>
<version>1.0.3</version>
</dependency>


byte[] mybankaccount=mybankaccount.getBytes();
String defaultEncoding = "UTF-8";
UniversalDetector detector = new UniversalDetector(null);
detector.handleData(mybankaccount, 0, mybankaccount.length);
detector.dataEnd();
String encoding = detector.getDetectedCharset();
detector.reset();
// log.info("字符编码是:{}", encoding);
if (encoding == null) {
encoding = defaultEncoding;
}

我检测出这个是UTF-8

然后我用下面方法,都不行

方法一

byte[] mybankaccountUTF8=mybankaccount.getBytes();
String mybankaccountUNI=new String(mybankaccountUTF8,"UTF-8");
String mybankaccountGBK=new String(mybankaccountUNI.getBytes("GBK"));

//上面这个方法有三分一的中文无法转过来

方法二

String mybankaccountGBK=charsetConvert(mybankaccount,"GBK");

private String charsetConvert(String str, String charset) {
try {
str = new sun.misc.BASE64Encoder().encode(str.getBytes(charset));
byte[] bytes = new sun.misc.BASE64Decoder().decodeBuffer(str);
str = new String(bytes, charset);
} catch(IOException e) {
e.printStackTrace();
}
return str;
}

//方法二这个办法完全无法转换,字符是乱码的


...全文
3496 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuangmu9768 2020-09-02
  • 打赏
  • 举报
回复
utf8字符集比gbk要多,部分字符是无法转换的
ilearn 2020-09-01
  • 打赏
  • 举报
回复
不行,文字变成这样 �� //这是盒 *中成��*牛黄上清胶囊
  • 打赏
  • 举报
回复
String u8str = "": byte[] bytes = u8str.getBytes("UTF8"); String gbkstr = new String(bytes,"GBK");
ilearn 2020-09-01
  • 打赏
  • 举报
回复
谢谢你们的帮忙,我搞定了
  • 打赏
  • 举报
回复
不好意思,这个确实写得有问题,这段代码属于人为制造乱码了。 第一个逻辑:已知字节数组是某字符串的u8编码-》将此数组new String(bytes,"u8"),如果此时指定为gbk,肯定为乱码-》得到字符串后,可以通过getBytes(encode)获取任意编码的字节数组,u8、gbk都可。 第二个逻辑:你有一个字符串,你认为他是u8,想把它转成gbk。这个描述本身就是错误的。你的字符串,你既可以使用u8来描述他,也可以用gbk描述他,你设置可以自己定义一种映射规则去描述他。 因此,从你的题目描述中“首先我尝试过检查String是什么编码的”,可以看出你并没有理解编码的含义,详见第二个逻辑。
引用 1 楼 的回复:
String u8str = "": byte[] bytes = u8str.getBytes("UTF8"); String gbkstr = new String(bytes,"GBK");
maradona1984 2020-09-01
  • 打赏
  • 举报
回复

byte[] mybankaccountUTF8=mybankaccount.getBytes();                                 
String mybankaccountUNI=new String(mybankaccountUTF8,"UTF-8");                   //这个应该没问题
String mybankaccountGBK=new String(mybankaccountUNI.getBytes("GBK"));      //这就错了,new String(mybankaccountUNI.getBytes("GBK"),"GBK");才对
maradona1984 2020-09-01
  • 打赏
  • 举报
回复
你这完全没搞明白字符集是什么东西,只能摸瞎写代码. 字符集你可以认为是一个字典,用于byte[]和String互转,你定义一个字符串,用gbk字符集转成的byte[]数组,那肯定得用gbk字符集来还原成字符串

public void testString() throws UnsupportedEncodingException {
        //默认字符集应该是UTF8.所以无参的getBytes方法等价于getBytes("utf-8")
        String a = "我是谁1234你是谁";
        byte [] gbkBytes = a.getBytes("gbk");   //转成gbk编码byte[]

        String gbkStr = new String(gbkBytes,"gbk"); //gbk编码的byte数组根据gbk字符集转成字符串

        String wrongStr = new String(gbkBytes);   //这样等价于new String(gbkBytes,"utf-8");

        byte [] utf8Bytes = gbkStr.getBytes("utf-8");  //转成utf8编码byte[]
        String utf8Str = new String(utf8Bytes,"utf-8");  //utf编码的byte数组根据utf字符集转成字符串
        String defaultStr = new String(utf8Bytes);  //默认字符集为utf8测试

        System.out.println(a);
        System.out.println(gbkStr);
        System.out.println(wrongStr);
        System.out.println(utf8Str);
        System.out.println(defaultStr);
    }
z_z__z 2021-08-30
  • 举报
回复
@maradona1984 照你的意思,你试试 new String(wrongStr.getBytes(),"gbk")能还原成 a吗
maradona1984 2021-08-31
  • 举报
回复
@z_z__z 很可能是不能的,因为中间不正确的字符集转换byte数组可能被丢掉末尾的元素,数据会丢失,自然没法转回来

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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