2012-01-19 10 views
9

करने के लिए सेट एन्कोडिंग मैं से http://api.freebase.com/api/trans/raw/m/0h47जावा UTF-8 नहीं URLConnection

डेटा पुनः प्राप्त करने के लिए आप पाठ में देख सकते हैं इस तरह गाती है देखते हैं कोशिश कर रहा हूँ।

जब मैं ú आदि

अब तक मैं निम्नलिखित कोड के साथ की कोशिश की है की तरह गाती है के साथ मैं पाठ पाने पेज से स्रोत प्राप्त करने की कोशिश:

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

क्या मैं गलत कर रहा हूँ?

मेरे पूरे कोड:

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(); } 

उत्तर

11

HTML पृष्ठ यूटीएफ -8 में है, और अरबी वर्णों और ऐसे का उपयोग कर सकता है। लेकिन यूनिकोड 127 के ऊपर वाले वर्ण अभी भी ú जैसे संख्यात्मक इकाइयों के रूप में एन्कोड किए गए हैं। एक स्वीकार्य-एन्कोडिंग यूटीएफ -8 के रूप में पूरी तरह से सही नहीं है, मदद और लोड नहीं करेगा।

आपको संस्थाओं को स्वयं डीकोड करना होगा। कुछ ऐसा:

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(); 
} 

जिस तरह से उन संस्थाएं संसाधित HTML रूपों से हो सकती हैं, इसलिए वेब ऐप के संपादन पक्ष पर।


प्रश्न में कोड के बाद:

मैं पाठ के लिए एक (बफर) रीडर के साथ DataInputStream जगह ले ली है। इनपुटस्ट्रीम बाइनरी डेटा, बाइट्स पढ़ते हैं; पाठक पाठ, स्ट्रिंग्स। एक इनपुटस्ट्रीम रीडर में इनपुट इनपुट और एन्कोडिंग पैरामीटर होता है, और एक रीडर देता है।

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

काम करने वाली एकमात्र चीज़ की तरह लगता है। धन्यवाद। – Ales

+0

मुझे एक ही समस्या है कृपया मदद करें। m.appendTail (एम); यह लाइन मुझे त्रुटि है। –

+0

@ ersyn61: क्षमा करें, सही किया गया; होना चाहिए था 'मैपेंडटेल (एसबी); '। –

2

खैर मैं सोच रहा हूँ समस्या यह है कि जब आप धारा से पढ़ रहे हैं। readLine पर कॉल करने के बजाय आपको DataInputStream पर readUTF विधि को कॉल करना चाहिए या, मैं क्या करूंगा, InputStreamReader बनाना होगा और एन्कोडिंग सेट करना होगा, फिर आप लाइन द्वारा BufferedReader लाइन से पढ़ सकते हैं (यह आपके मौजूदा प्रयास के अंदर होगा/पकड़):

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

अपने URLConnection को भी उपयोगकर्ता एजेंट जोड़ने का प्रयास करें:

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

यह एक आकर्षण की तरह मेरे डिकोडिंग समस्या हल हो।

+1

इस उत्तर को दिनों के लिए खोज रहा है! – oferiko

संबंधित मुद्दे