2012-01-19 1 views
9

Je suis en train de récupérer des données à partir http://api.freebase.com/api/trans/raw/m/0h47Java encodage UTF-8 non définie à URLConnection

Comme vous pouvez le voir dans le texte il y a chante comme ceci: /ælˈdʒɪəriə/.

Lorsque je tente d'obtenir la source de la page que je reçois du texte avec comme ú etc. chante

Jusqu'à présent, je l'ai essayé avec le code suivant:

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

Qu'est-ce que je fais mal?

Mon code entier:

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

Répondre

11

La page HTML est en UTF-8, et pourrait utiliser des caractères arabes et autres. Mais ces caractères au-dessus de Unicode 127 sont toujours codés comme des entités numériques comme ú. Un Accept-Encoding ne sera pas, aidera, et charger comme UTF-8 est tout à fait raison.

Vous devez décoder vous-même les entités. Quelque chose comme:

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

Par la façon dont ces entités pourraient provenir de formulaires HTML traités, donc sur le côté de l'édition de l'application web.


Après le code en question:

J'ai remplacé DataInputStream avec un (Buffered) lecteur pour le texte. InputStreams lit les données binaires, octets; Texte des lecteurs, Strings. Un InputStreamReader a comme paramètre un InputStream et un encodage, et renvoie 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

On dirait que la seule chose qui va fonctionner. Je vous remercie. – Ales

+0

J'ai le même problème s'il vous plaît aider. m.appendTail (m); cette ligne me fait erreur. –

+0

@ ersyn61: Désolé, corrigé; aurait dû être m.appendTail (sb); –

2

Eh bien je pense que le problème est lorsque vous lisez du flux. Vous devriez soit appeler la méthode readUTF sur le DataInputStream au lieu d'appeler readLine ou, ce que je ferais, serait de créer un InputStreamReader et de définir l'encodage, alors vous pouvez lire à partir de la ligne BufferedReader par ligne (ce serait dans votre essai existant/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

Essayez d'ajouter aussi l'agent utilisateur à votre 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"); 

Ce résolu mon problème de décodage comme un charme.

+1

été la recherche de cette réponse pendant des jours! – oferiko