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转成新字符串,这相当于做了一次无效甚至反向的编码转换,只会让乱码更严重。
解决方法
- 从源文件读取时指定正确编码
如果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);
修复
proc.getPrettyJSON()的编码问题
如果proc.getPrettyJSON()是从字节流生成的字符串,要确认它内部是否用了正确编码。比如这个方法如果读取外部资源时用了默认编码,那拿到的字符串已经是乱码状态,后续转码无法恢复。此时需要修改该方法,让它在生成字符串时指定正确编码(比如UTF-8、Windows-1256)。反向转码恢复已乱码的字符串
如果已经拿到了乱码的字符串,可以尝试将其按错误编码转回字节,再用正确编码重新解码:
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
相关产品推荐
相关产品推荐

