Java 字符集转换问题,求助

2021-04-08 13:51:29 +08:00
 wenlongde

命令行:

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")); 得到的是乱码,什么原因呢?

1748 次点击
所在节点    Java
5 条回复
wenlongde
2021-04-08 13:53:02 +08:00
接口返回的是含有中文字符的 GBK 编码的报文
ychost
2021-04-08 14:04:32 +08:00
你写错了,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
2021-04-08 14:28:03 +08:00
`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
2021-04-08 14:37:43 +08:00
Java 的 String 内部编码是 UTF-16 。
HTTP 数据接收转字符串的时候会进行一次转码,默认由 -​Dfile.encoding 指定的编码转,没有指定 -​Dfile.encoding 就会预定义一个编码,Windows 系统一般为 GBK 。
这时如果用错编码就可能会造成数据丢失得到一个不完整的 String,这时再转换编码也没用了。
dallaslu
2021-04-09 01:27:17 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/769042

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX