byte[] bytes = json.getBytes("UTF-8");
дает вам последовательности байтов UTF-8, поэтому URLReader.read также дает вам последовательности байтов UTF-8
, но вы пытались декодировать без указания кодера, то есть new String(URLReader.read("pl", "en", "koń"))
, поэтому Java будетиспользуйте кодировку по умолчанию для вашей системы (которая не является UTF-8)
Попробуйте:
new String(URLReader.read("pl", "en", "koń"), "UTF-8")
Обновление
Здесь полностью рабочий кодна моей машине:
public class URLReader {
public static byte[] read(String from, String to, String string) {
try {
String text = "http://translate.google.com/translate_a/t?"
+ "client=o&text=" + URLEncoder.encode(string, "UTF-8")
+ "&hl=en&sl=" + from + "&tl=" + to + "";
URL url = new URL(text);
URLConnection conn = url.openConnection();
// Look like faking the request coming from Web browser solve 403 error
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 (.NET CLR 3.5.30729)");
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String json = in.readLine();
byte[] bytes = json.getBytes("UTF-8");
in.close();
return bytes;
//return text.getBytes();
} catch (Exception e) {
System.out.println(e);
// becarful with returning null. subsequence call will return NullPointException.
return null;
}
}
}
Не забудьте сбежать с \ u0144.Компилятор Java может не скомпилировать текст Unicode надлежащим образом, поэтому рекомендуется написать его в простом ASCII.
public class AbcServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/plain;charset=UTF-8");
byte[] read = URLReader.read("pl", "en", "ko\u0144");
resp.getOutputStream().write(read) ;
}
}