2012-01-19 25 views
9

Tôi đang cố gắng để lấy dữ liệu từ http://api.freebase.com/api/trans/raw/m/0h47Java mã UTF-8 không được đặt để URLConnection

Như bạn có thể thấy trong văn bản có hát như thế này: /ælˈdʒɪəriə/.

Khi tôi cố gắng để có được nguồn từ trang tôi nhận được văn bản với hát như ú, vv

Cho đến nay tôi đã thử với đoạn mã sau:

urlConnection.setRequestProperty("Accept-Charset", "UTF-8"); 
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); 

Tôi đang làm gì sai?

toàn bộ mã của tôi:

URL url = null; 
URLConnection urlConn = null; 
DataInputStream input = null; 
try { 
url = new URL("http://api.freebase.com/api/trans/raw/m/0h47"); 
} catch (MalformedURLException e) {e.printStackTrace();} 

try { 
    urlConn = url.openConnection(); 
} catch (IOException e) { e.printStackTrace(); } 
urlConn.setRequestProperty("Accept-Charset", "UTF-8"); 
urlConn.setRequestProperty("Content-Type", "text/plain; charset=utf-8"); 

urlConn.setDoInput(true); 
urlConn.setUseCaches(false); 

StringBuffer strBseznam = new StringBuffer(); 
if (strBseznam.length() > 0) 
    strBseznam.deleteCharAt(strBseznam.length() - 1); 

try { 
    input = new DataInputStream(urlConn.getInputStream()); 
} catch (IOException e) { e.printStackTrace(); } 
String str = ""; 
StringBuffer strB = new StringBuffer(); 
strB.setLength(0); 
try { 
    while (null != ((str = input.readLine()))) 
    { 
     strB.append(str); 
    } 
    input.close(); 
} catch (IOException e) { e.printStackTrace(); } 

Trả lời

11

Trang HTML ở dạng UTF-8 và có thể sử dụng các ký tự tiếng Ả Rập và như vậy. Nhưng những ký tự trên Unicode 127 vẫn được mã hóa dưới dạng thực thể số như ú. Một Accept-Encoding sẽ không, trợ giúp và tải như UTF-8 là hoàn toàn đúng.

Bạn phải tự giải mã các thực thể. Một cái gì đó như:

String decodeNumericEntities(String s) { 
    StringBuffer sb = new StringBuffer(); 
    Matcher m = Pattern.compile("\\&#(\\d+);").matcher(s); 
    while (m.find()) { 
     int uc = Integer.parseInt(m.group(1)); 
     m.appendReplacement(sb, ""); 
     sb.appendCodepoint(uc); 
    } 
    m.appendTail(sb); 
    return sb.toString(); 
} 

Bằng cách này, các thực thể có thể xuất phát từ biểu mẫu HTML đã xử lý, do đó, ở phía chỉnh sửa của ứng dụng web.


Sau khi mã trong câu hỏi:

tôi đã thay thế DataInputStream với một (Buffered) Reader cho văn bản. InputStreams đọc dữ liệu nhị phân, byte; Độc giả văn bản, Strings. InputStreamReader có tham số là InputStream và mã hóa và trả về một Reader.

try { 
    BufferedReader input = new BufferedReader(
      new InputStreamReader(urlConn.getInputStream(), "UTF-8")); 
    StringBuilder strB = new StringBuilder(); 
    String str; 
    while (null != (str = input.readLine())) { 
     strB.append(str).append("\r\n"); 
    } 
    input.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

Có vẻ như điều duy nhất sẽ hoạt động. Cảm ơn bạn. – Ales

+0

Tôi có cùng một vấn đề xin vui lòng giúp đỡ. m.appendTail (m); dòng này báo lỗi cho tôi. –

+0

@ ersyn61: Xin lỗi, đã sửa; lẽ ra phải là 'm.appendTail (sb);'. –

2

Vâng, tôi đang nghĩ đến vấn đề là khi bạn đang đọc từ stream. Bạn nên gọi phương thức readUTF trên DataInputStream thay vì gọi readLine hoặc, tôi sẽ làm gì để tạo InputStreamReader và đặt mã hóa, sau đó bạn có thể đọc từ dòng BufferedReader (điều này sẽ nằm trong thử nghiệm hiện tại của bạn/catch):

Charset charset = Charset.forName("UTF8"); 
InputStreamReader stream = new InputStreamReader(urlConn.getInputStream(), charset); 
BufferedReader reader = new BufferedReader(stream); 
StringBuffer responseBuffer = new StringBuffer(); 

String read = ""; 
while ((read = reader.readLine()) != null) { 
    responseBuffer.append(read); 
} 
5

Cố gắng thêm cũng user agent để URLConnection của bạn:

urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36"); 

này giải quyết vấn đề giải mã của tôi như một say mê.

+1

đang tìm kiếm câu trả lời này trong nhiều ngày! – oferiko

Các vấn đề liên quan