2010-12-29 22 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; 
      } 
     } 
     } 

と:{"sentences"[{"trans":"end","orig":"koďż˝","translit":"","src_translit":""}],"src":"pl","server_time":30} ので、UTF doesntの仕事を正しくが、私はエンコードされたURLを返す場合:私はこれを実行するとutf8文字でURLコンテンツを正しく読み込むには?

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ń"))); 
} 
} 

は私が手http://translate.google.com/translate_a/t?client=o&text=ko%C5%84&hl=en&sl=pl&tl=enと私が正しく取得URLバーに貼り付けます。{"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ではありません)復号化するために、システムのデフォルトのエンコーディングを使用する、エンコーダを指定せずに解読しようとした

試してみてください。

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形式で記述することをお勧めします。 」[ "} { "トランス": "終了"、 "ORIG": "KO"、 "TRANSLIT": ""、 "src_translit""] HMM今{ "文" を返す

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 ":" pl "、" server_time ":20} – Infinity

+0

これはあなたのウェブブラウザからですか?エンコードされたバイトを処理するときは、PrinWriterを使用しないでください。 PrintWriterは、UTF-8ではないJVMデフォルトエンコーダを使用します。 getOutputStream.write(新しいString(URLReader.read( "pl"、 "en"、 "koń")、 "UTF-8") ).getBytes( "UTF-8")) – gigadot

+0

はい、ブラウザから。今度は "orig": "koďż" "... – Infinity

関連する問題