2010-12-29 3 views
0
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); 
      BufferedReader in = new BufferedReader(
         new InputStreamReader(url.openStream(), "UTF-8")); 
      String json = in.readLine(); 
      byte[] bytes = json.getBytes("UTF-8"); 
      in.close(); 
      return bytes; 
        //return text.getBytes(); 
      } 
      catch (Exception e) { 
      return null; 
      } 
     } 
     } 

и:Как правильно читать URL-адрес с помощью символов utf8?

public class AbcServlet extends HttpServlet { 
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
    resp.setContentType("text/plain;charset=UTF-8"); 
    resp.getWriter().println(new String(URLReader.read("pl", "en", "koń"))); 
} 
} 

Когда я запускаю это я получаю: {"sentences"[{"trans":"end","orig":"koďż˝","translit":"","src_translit":""}],"src":"pl","server_time":30} так UTF не работает правильно, но если я вернуть кодированный URL: http://translate.google.com/translate_a/t?client=o&text=ko%C5%84&hl=en&sl=pl&tl=en и вставить в адресной строке я получаю правильно: {"sentences":[{"trans":"horse","orig":"koń","translit":"","src_translit":""}],"dict":[{"pos":"noun","terms":["horse"]}],"src":"pl","server_time":76}

ответ

2
byte[] bytes = json.getBytes("UTF-8"); 

дает вам последовательности байтов UTF-8, поэтому URLReader.read также дает вам последовательности байтов UTF-8

но вы пытались расшифровать с без указания кодировщика, т.е. new String(URLReader.read("pl", "en", "koń")) так Java будет использовать кодировку по умолчанию системы для декодирования (который не является UTF-8)

Try:

new String(URLReader.read("pl", "en", "koń"), "UTF-8") 

Update

Здесь полностью рабочий код на моей машине:

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) ; 
    } 
} 
+0

хмм теперь возвращает { "предложения": [{ "транс": "конец", "туринг": "Ко", "транслит": "", "src_translit": ""}],» src ":" pl "," server_time ": 20} – Infinity

+0

Это из вашего веб-браузера? Не используйте PrinWriter, когда вы имеете дело с закодированными байтами. PrintWriter будет использовать кодировщик по умолчанию JVM, который не является UTF-8. Попробуйте getOutputStream.write ((новая строка (URLReader.read («pl», «en», «koń»), «UTF-8») ) .getBytes («UTF-8»)) – gigadot

+0

да, из браузера. теперь я получаю ... "orig": "koďż˝" ... – Infinity

Смежные вопросы