百度翻译乱码
[ 一、问题描述:](# 一、问题描述:)
[二、解决方法](# 二、解决方法)
idea版本为2021.03版本,可供参考
一、问题描述:
在调用百度翻译api时,返回的翻译为一串奇怪的编码。
{"from":"en","to":"zh","trans_result":[{"src":"yellow","dst":"\u9ec4\u7684"}]}
翻译的原始单词为“yellow”,即返回的src字段,所以我们很容易知道dst字段就是翻译的中文结果,只是编码错误。
后续查阅相关资料:根据返回结果可知,“dst”:“\u9ec4\u7684"实际是"dst”:“黄的"的Unicode编码,它在UTF-8编码下的值就是”\u9ec4\u7684",因此这不是真正的乱码。如果你直接打印字符串,结果会显示为乱码,但这并不影响后续程序中该字符串的处理和工作。如果你想在控制台中以中文字符打印出该字符串,可以尝试调整控制台的编码格式。如果你想从这段返回结果中提取出翻译结果,可以使用json库对其进行解析。
感觉也有可能和idea的编码设置有关,后续有另外的解决方法我再进行补充。在此我先使用json库来解决
二、解决方法
使用json库进行翻译结果的解析。
- 首先给我们的项目导入json的jar包,具体方法可参考我另一篇博客。
idea导入jar包 - 编写TransUtils类,对翻译的结果进行json解析。
代码如下:
解释一下下面的代码,防止有些同学不懂。
方法getTrans的输入参数result,它接收原始unicode编码的翻译,也就是上面讲的{"from":"en","to":"zh","trans_result":[{"src":"yellow","dst":"\u9ec4\u7684"}]}
,这个方法的目的就是使用json来解析成中文。
return的dst参数,就是翻译后的正确中文显示。
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class TransUtils {
public static String getTrans(String result) {
try {
JSONObject jsonObject = new JSONObject(result);
String from = jsonObject.getString("from");
String to = jsonObject.getString("to");
JSONArray transResults = jsonObject.getJSONArray("trans_result");
String src = transResults.getJSONObject(0).getString("src");
String dst = transResults.getJSONObject(0).getString("dst");
// System.out.println("from:" + from);
// System.out.println("to:" + to);
// System.out.println("src:" + src);
// System.out.println("dst:" + dst);
return dst;
} catch (JSONException e) {
e.printStackTrace();
}
return result;
}
}
- Main主类调用这个方法获取中文显示。
代码如下:
import com.baidu.translate.demo.TransApi;
import com.baidu.translate.demo.TransUtils;
public class Main {
// 在平台申请的APP_ID 详见 http://api.fanyi.baidu.com/api/trans/product/desktop?req=developer
private static final String APP_ID = "***";
private static final String SECURITY_KEY = "***";
public static void main(String[] args) {
TransApi api = new TransApi(APP_ID, SECURITY_KEY);
String query = "yellow";
String transResult = api.getTransResult(query, "auto", "zh");
System.out.println(transResult);
System.out.println(TransUtils.getTrans(transResult));
}
}
- 可以看到打印台显示的正确内容