2012-01-19 1 views
9

Я пытаюсь получить данные из http://api.freebase.com/api/trans/raw/m/0h47Java UTF-8 кодировка не установлен URLConnection

Как вы можете видеть в тексте есть поет так: /ælˈdʒɪəriə/.

Когда я пытаюсь получить источник со страницы, я получаю текст с поёт как ú и т.д.

До сих пор я попытался с помощью следующего кода:

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-страница находится в UTF-8 и может использовать арабские символы и т. д. Но эти символы выше Unicode 127 по-прежнему кодируются как числовые объекты, такие как ú. Accept-Encoding не будет, поможет и загрузится, поскольку UTF-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 с (буферном) чтения текста. InputStreams считывают двоичные данные, байты; Текст читателей, Строки. InputStreamReader имеет в качестве параметра InputStream и кодировку и возвращает 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

Кажется, единственное, что будет работать. Спасибо. – Ales

+0

У меня такая же проблема, пожалуйста, помогите. m.appendTail (м); эта строка меня испугает. –

+0

@ ersyn61: Извините, исправлено; должен быть 'm.appendTail (sb);'. –

2

Ну я думаю, проблема в том, когда вы читаете из потока. Вы должны либо вызвать метод readUTF на DataInputStream вместо того, чтобы звонить readLine, или, что бы я сделал, было бы создать 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

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

  • Нет связанных вопросов^_^