V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wenlongde
V2EX  ›  Java

Java 字符集转换问题,求助

  •  
  •   wenlongde · 8 天前 · 687 次点击

    命令行:

    curl 'http://192.168.1.1:9040/S041' | iconv -f gbk -t utf8

    可以得到正常的结果,符合预期

    java 代码: new String(retStr.getBytes(Charset.forName("GBK")), Charset.forName("UTF-8")); 得到的是乱码,什么原因呢?

    5 条回复    2021-04-09 01:27:17 +08:00
    wenlongde
        1
    wenlongde   8 天前
    接口返回的是含有中文字符的 GBK 编码的报文
    ychost
        2
    ychost   8 天前
    你写错了,GBK -> UTF8 这样写

    new String(str.getBytes("UTF-8"),"UTF-8");

    注:只需要写目标编码,原始编码可忽略
    可以参考: https://github.com/jinpang/Android/blob/master/Java%20%E6%AD%A3%E7%A1%AE%E7%9A%84%E5%81%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%BC%96%E7%A0%81%E8%BD%AC%E6%8D%A2
    iamlbk
        3
    iamlbk   8 天前
    `new String(retStr.getBytes(Charset.forName("GBK")), Charset.forName("UTF-8"));`
    retStr 应该已经有问题了, 在接收结果的地方处理编码问题

    还有一种方式可以尝试下(UTF-8 是接收编码):
    `new String(retStr.getBytes(Charset.forName("UTF-8")), Charset.forName("GBK"));`
    cheng6563
        4
    cheng6563   8 天前
    Java 的 String 内部编码是 UTF-16 。
    HTTP 数据接收转字符串的时候会进行一次转码,默认由 -​Dfile.encoding 指定的编码转,没有指定 -​Dfile.encoding 就会预定义一个编码,Windows 系统一般为 GBK 。
    这时如果用错编码就可能会造成数据丢失得到一个不完整的 String,这时再转换编码也没用了。
    dallaslu
        5
    dallaslu   8 天前 via iPhone
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2027 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 15ms · UTC 05:14 · PVG 13:14 · LAX 22:14 · JFK 01:14
    ♥ Do have faith in what you're doing.