You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java读取JSON字符串中非拉丁字符乱码问题求助

解决JSON中非拉丁字符乱码问题

我的TXT文件里的一段JSON字符串,其中非拉丁字符显示为乱码(�����),原本应该是阿拉伯语或法语字符(如à、é等)。我尝试了以下代码:

data = new String(proc.getPrettyJSON().getBytes(), "UTF-8");

但结果还是乱码,JSON示例如下:

"PersonalDetails": {
        "BirthDate": "19960321",
        "FullName": "SMITH<<�����",
        "OtherNames": [
            "MARY<<����"
        ],  
    },

问题根源

你写的代码逻辑完全错误:proc.getPrettyJSON()本身已经是字符串,调用getBytes()时会使用当前JVM的默认编码将字符串转成字节数组,再用UTF-8转成新字符串,这相当于做了一次无效甚至反向的编码转换,只会让乱码更严重。

解决方法

  1. 从源文件读取时指定正确编码
    如果JSON是从TXT文件读取的,直接在读取阶段就用对应编码(阿拉伯语常用Windows-1256,法语常用ISO-8859-1或UTF-8)加载,避免中途转码出错:
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

// 示例:用Windows-1256编码读取文件
String jsonContent = new String(Files.readAllBytes(Paths.get("your-file.txt")), Charset.forName("Windows-1256"));
// 若为法语,可尝试ISO-8859-1
// String jsonContent = new String(Files.readAllBytes(Paths.get("your-file.txt")), StandardCharsets.ISO_8859_1);
  1. 修复proc.getPrettyJSON()的编码问题
    如果proc.getPrettyJSON()是从字节流生成的字符串,要确认它内部是否用了正确编码。比如这个方法如果读取外部资源时用了默认编码,那拿到的字符串已经是乱码状态,后续转码无法恢复。此时需要修改该方法,让它在生成字符串时指定正确编码(比如UTF-8、Windows-1256)。

  2. 反向转码恢复已乱码的字符串
    如果已经拿到了乱码的字符串,可以尝试将其按错误编码转回字节,再用正确编码重新解码:

String messedUpStr = proc.getPrettyJSON();
// 假设原字节是Windows-1256编码,却被用ISO-8859-1转成了字符串
String fixedStr = new String(messedUpStr.getBytes(StandardCharsets.ISO_8859_1), Charset.forName("Windows-1256"));
System.out.println(fixedStr);

可以多试几种编码组合,直到得到正确的字符。

内容的提问来源于stack exchange,提问作者m. gep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:12:27