Java应用中如何用ISO-8859-1编码JSON?Shopify接口字符乱码求助
解决Java调用Shopify API的字符乱码问题
问题根源
你的乱码本质是UTF-8字节被错误地以ISO-8859-1编码解码:比如ú的UTF-8是0xC3 0xBA,当成ISO-8859-1读就会变成ú,和你遇到的现象完全匹配。
问题出在两个核心点:
- curl请求里指定了
Accept: application/json;charset=ISO-8859-1,但Shopify API实际返回的是UTF-8编码的响应,不会因为你指定这个头就转码。 - 你尝试的几次手动转码操作都是无效甚至有害的:Java的
String内部是UTF-16编码,直接对toString()的结果做字节转换只会破坏原有编码逻辑。
另外,两台Win10机器的显示差异是因为应用/控制台的默认编码不同:你的机器默认用UTF-8解析输出,另一台可能用了GBK或系统默认的ISO-8859-1,导致已经错误的字符显示更异常。
修复步骤
1. 修正请求的Accept头
直接去掉charset指定,或者明确要求UTF-8:
curl --ssl-no-revoke -sb -X GET "myshopiy_url" -H "X-Shopify-Access-Token: token" -H "Accept: application/json;charset=UTF-8"
如果是用Java HTTP客户端(比如HttpClient、OkHttp)调用,务必确保客户端以UTF-8解码响应,不要依赖系统默认编码。
2. 移除所有手动转码代码
直接使用原始字符串即可,不需要做任何字节转换:
String destination_name = destination.get("first_name").toString() + " " + destination.get("last_name").toString();
如果用JSON解析库(比如Jackson、Gson),要确保解析器用UTF-8读取响应流,不要指定错误的编码。
3. 统一输出/显示的编码
如果是控制台输出,启动Java程序时指定编码参数:
java -Dfile.encoding=UTF-8 YourMainClass
如果是GUI或Web应用,确保界面组件的字符编码设置为UTF-8。
验证方法
可以打印字符串的字节数组,确认是否为UTF-8编码:
import java.nio.charset.StandardCharsets; import java.util.Arrays; // 加入到代码中验证 byte[] bytes = destination_name.getBytes(StandardCharsets.UTF_8); System.out.println(Arrays.toString(bytes));
比如Número的UTF-8字节应该是[78, -61, -86, 109, 101, 114, 111],如果匹配说明编码正确,剩下的就是显示端的编码配置问题。
内容的提问来源于stack exchange,提问作者RJA
相关产品推荐
相关产品推荐

