Java调用谷歌翻译API丢失带变音符号字符问题排查
问题原因分析
你遇到的变音字符丢失问题,本质是谷歌网页端翻译接口的反滥用/客户端检测机制导致的。该接口专为浏览器访问设计,会根据请求中的客户端特征(如请求头)返回不同内容:
- 浏览器发送请求时,会附带完整的User-Agent、Accept、Accept-Language等头信息,被识别为合法客户端,返回包含变音字符的完整翻译结果。
- 你的Java代码仅设置了Content-Type头,缺少这些关键标识,被判定为非浏览器请求,谷歌会返回简化后的文本(自动移除变音字符)作为限制措施。
解决方案
在请求中添加模拟浏览器的请求头,让谷歌接口识别你的请求为合法浏览器访问即可。修改后的Java代码如下:
import java.io.IOException; import java.net.URI; import java.net.http.HttpRequest; import java.net.http.HttpRequest.Builder; import java.net.http.HttpResponse; import java.time.Duration; import java.net.http.HttpClient; import java.net.http.HttpResponse.BodyHandlers; public class TestTranslate { public static void main(String[] args) { try{ HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofMinutes(1)).build(); String translatePayload = "async=translate,sl:en,tl:ro,st:delete,id:" + System.currentTimeMillis() + ",qc:true,ac:true,_id:tw-async-translate,_pms:s,_fmt:pc"; Builder requestBuilder = HttpRequest.newBuilder().uri(URI.create("https://www.google.com/async/translate")) .timeout(Duration.ofMinutes(1)) // 添加模拟浏览器的请求头 .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") .header("Accept-Language", "en-US,en;q=0.5") .header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); HttpRequest request = requestBuilder.POST(HttpRequest.BodyPublishers.ofString(translatePayload)).build(); HttpResponse<String> response = client.send(request, BodyHandlers.ofString()); System.out.println("=======================1"); System.out.println(response.body()); } catch(Exception e) { System.out.println("=======================2"); e.printStackTrace(System.out); } } }
额外提示
谷歌网页端的/async/translate并非官方公开API,其接口规则和限制随时可能变更,长期使用建议改用谷歌官方的Cloud Translation API,避免因接口调整导致功能失效。
内容的提问来源于stack exchange,提问作者Yonoss
相关产品推荐
相关产品推荐

