2012-01-19 13 views
9

estoy tratando de recuperar datos de http://api.freebase.com/api/trans/raw/m/0h47Java codificación UTF-8 no establecida URLConnection

Como se puede ver en el texto existen canta así: /ælˈdʒɪəriə/.

Cuando intento para conseguir la fuente de la página de recibo de texto con canta como ú etc.

Hasta ahora he intentado con el siguiente código:

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

¿Qué estoy haciendo mal?

Toda mi código:

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

Respuesta

11

La página HTML es en UTF-8, y podría utilizar caracteres arábigos y tal. Pero esos caracteres sobre Unicode 127 todavía están codificados como entidades numéricas como ú. Una codificación de aceptación no ayudará, cargará y cargará, ya que UTF-8 tiene toda la razón.

Tiene que decodificar las entidades usted mismo. Algo así como:

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

Por cierto estas entidades podrían derivarse de formularios HTML procesados, por lo que en el lado de edición de la aplicación web.


Después código en cuestión:

he sustituido con un DataInputStream (búfer) Lector de texto. InputStreams lee datos binarios, bytes; Texto de los lectores, cadenas. Un InputStreamReader tiene como parámetro un InputStream y una codificación, y devuelve un 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

Parece que lo único que funcionará. Gracias. – Ales

+0

Tengo el mismo problema por favor ayuda. m.appendTail (m); esta linea me error –

+0

@ ersyn61: Perdón, corregido; debería haber sido 'm.appendTail (sb);'. –

2

Bueno, yo estoy pensando que el problema es cuando se está leyendo de la corriente. Debería llamar al método readUTF en el DataInputStream en lugar de llamar al readLine o, lo que haría, sería crear un InputStreamReader y establecer la codificación, entonces puede leer el BufferedReader línea por línea (esto sería dentro de su intento existente)/captura):

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

Trate de añadir también el agente de usuario a su 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"); 

Esto resolvió mi problema de decodificación como un encanto.

+1

estado buscando esta respuesta por días. – oferiko

Cuestiones relacionadas