为何我的程序返回的部分西班牙语字符显示为Unicode编码?
问题:西班牙语特殊字符显示为Unicode编码的解决办法
我编写了一个简单的Maven程序,调用DEVISTY的文本翻译API并展示结果。API网站端点的翻译显示正常,但在程序中以字符串展示时,倒问号、带重音的'e'等西班牙语字符显示为Unicode编码。尝试转换为UTF-8编码,但结果依旧。相关代码如下:
package myprogram.translator; import java.net.URLEncoder; import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.JsonNode; import com.mashape.unirest.http.Unirest; import com.mashape.unirest.http.exceptions.UnirestException; import java.util.Scanner; import org.apache.commons.codec.binary.StringUtils; /** * Hello world! * */ public class App { public static void main( String[] args ) throws Exception { stringGen gen = new stringGen(); // TEST APPLICATION(lets hope it runs) Scanner scan = new Scanner(System.in); String startL; String targetL; String translateThis; String end; System.out.println("What would you like to be your starting language?"); startL = scan.nextLine(); System.out.println("What would you like to be your target language?"); targetL = scan.nextLine(); System.out.println("What would you like to translate exactly?"); translateThis = scan.nextLine(); end = gen.finalInput(startL, targetL, translateThis); System.out.println(end); HttpResponse<String> letsgetit = Unirest.post("https://text-translator2.p.rapidapi.com/translate") .header("content-type", "application/x-www-form-urlencoded") .header("X-RapidAPI-Key", "ef0ddf5c2dmsh5ccc18a926d497cp1b6b93jsn9f9e3bdc6353") .header("X-RapidAPI-Host", "text-translator2.p.rapidapi.com") .body(end) .asString(); String hutas = letsgetit.getBody(); byte[] bytes = StringUtils.getBytesUtf8(hutas); String utf8EncodedString = StringUtils.newStringUtf8(bytes); System.out.println(utf8EncodedString); } }
解决办法
问题根源
你当前用asString()直接获取响应后做的UTF-8编码转换完全无效——API返回的是JSON格式,其中特殊字符是以Unicode转义序列(如\u00BF、\u00E9)存在的,普通字符串转换无法解析这些转义,必须通过JSON解析器处理。
修改步骤
- 把
HttpResponse<String>替换为HttpResponse<JsonNode>,用asJsonNode()获取响应,让Unirest自动解析JSON结构。 - 从JSON节点中直接提取翻译结果,JSON解析器会自动将Unicode转义序列转换为对应的特殊字符。
- 删除所有
StringUtils相关的编码转换代码,这步操作对解决问题没有帮助。
修改后的代码
package myprogram.translator; import java.util.Scanner; import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.JsonNode; import com.mashape.unirest.http.Unirest; public class App { public static void main( String[] args ) throws Exception { stringGen gen = new stringGen(); Scanner scan = new Scanner(System.in); String startL; String targetL; String translateThis; String end; System.out.println("请输入源语言:"); startL = scan.nextLine(); System.out.println("请输入目标语言:"); targetL = scan.nextLine(); System.out.println("请输入要翻译的内容:"); translateThis = scan.nextLine(); end = gen.finalInput(startL, targetL, translateThis); System.out.println("请求体内容:" + end); // 改为获取JsonNode类型的响应,自动解析JSON HttpResponse<JsonNode> letsgetit = Unirest.post("https://text-translator2.p.rapidapi.com/translate") .header("content-type", "application/x-www-form-urlencoded") .header("X-RapidAPI-Key", "ef0ddf5c2dmsh5ccc18a926d497cp1b6b93jsn9f9e3bdc6353") .header("X-RapidAPI-Host", "text-translator2.p.rapidapi.com") .body(end) .asJsonNode(); // 从JSON对象中提取翻译结果,自动处理Unicode转义 String translatedText = letsgetit.getBody().getObject().getString("translatedText"); System.out.println("翻译结果:" + translatedText); } }
额外注意
- 确保
stringGen.finalInput()方法正确对请求参数做URL编码,避免特殊字符导致请求失败。 - 如果控制台仍显示乱码,检查IDE或终端的字符编码设置,确保其使用UTF-8编码显示输出。
内容的提问来源于stack exchange,提问作者a true scotsman uth
相关产品推荐
相关产品推荐

