Android Java UTF-8 HttpClient Problème
Je suis bizarre personnage problèmes d'encodage avec un tableau JSON qui est extrait d'une page web. Le serveur est de l'envoi de retour cet en-tête:
Content-Type text/javascript; charset=UTF-8
Aussi je peux regarder la sortie JSON dans Firefox ou tout autre navigateur et Unicode, les caractères s'affichent correctement. La réponse contient parfois des mots d'une autre langue avec des accents de symboles et de ces. Cependant, je suis l'obtention de ces étranges marques de question quand je le tire vers le bas et de le mettre à une chaîne de caractères en Java. Voici mon code:
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "utf-8");
params.setBooleanParameter("http.protocol.expect-continue", false);
HttpClient httpclient = new DefaultHttpClient(params);
HttpGet httpget = new HttpGet("http://www.example.com/json_array.php");
HttpResponse response;
try {
response = httpclient.execute(httpget);
if(response.getStatusLine().getStatusCode() == 200){
//Connection was established. Get the content.
HttpEntity entity = response.getEntity();
//If the response does not enclose an entity, there is no need
//to worry about connection release
if (entity != null) {
//A Simple JSON Response Read
InputStream instream = entity.getContent();
String jsonText = convertStreamToString(instream);
Toast.makeText(getApplicationContext(), "Response: "+jsonText, Toast.LENGTH_LONG).show();
}
}
} catch (MalformedURLException e) {
Toast.makeText(getApplicationContext(), "ERROR: Malformed URL - "+e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "ERROR: IO Exception - "+e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
} catch (JSONException e) {
Toast.makeText(getApplicationContext(), "ERROR: JSON - "+e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
private static String convertStreamToString(InputStream is) {
/*
* To convert the InputStream to String we use the BufferedReader.readLine()
* method. We iterate until the BufferedReader return null which means
* there's no more data to read. Each line will appended to a StringBuilder
* and returned as String.
*/
BufferedReader reader;
try {
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
} catch (UnsupportedEncodingException e1) {
//TODO Auto-generated catch block
e1.printStackTrace();
}
StringBuilder sb = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
Comme vous pouvez le voir, je suis spécifiant l'UTF-8 sur le InputStreamReader mais chaque fois que je vois le retour JSON texte par le Toast qu'il a d'étranges points d'interrogation. Je pense que j'ai besoin d'envoyer l'InputStream à un byte[] à la place?
Merci d'avance pour toute aide.
OriginalL'auteur Michael Taggart | 2010-12-18
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
jamais l'esprit. J'ai été un idiot et foiré quelque chose avec mon url. Il fonctionne! Les personnages sont rendus correctement!
Cette réponse est très bon et j'avais accepter celle-ci, si j'avais posé la question.
Merci pour le rappel. J'ai complètement oublié de cliquer sur la case à cocher. Mes excuses Arhimed.
Et pour l'affichage des
UrlEncodedFormEntity encodedFormEntity = new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8); post.setEntity(encodedFormEntity);
🙂OriginalL'auteur Vit Khudenko
@Arhimed la réponse est la solution. Mais je ne vois rien de toute évidence, le problème avec votre
convertStreamToString
code.Mes suppositions sont:
convertStreamToString
est de lire le flux de caractères d'une ligne à la fois, et remontage à l'aide d'un hard-wired'\n'
comme la fin de la ligne de repère. Si vous allez pour écrire dans un fichier externe ou de l'application, vous devriez probablement vous devriez être en utilisant une plate-forme spécifique de fin de ligne de repère.OriginalL'auteur Stephen C
C'est juste que votre convertStreamToString ne se conforme pas à l'encodage défini dans le HttpRespnose. Si vous regardez à l'intérieur de
EntityUtils.toString(entity, HTTP.UTF_8)
, vous verrez que EntityUtils savoir si il y a d'encodage défini dans le HttpResponse d'abord, puis si il y est, EntityUtils utiliser cet encodage. Il ne reviendra à l'encodage passé dans le paramètre(dans ce cas, HTTP.UTF_8) si il n'y a pas d'encodage défini dans l'entité.De sorte que vous pouvez dire que votre HTTP.UTF_8 est passé dans le paramètre, mais il ne s'habituent jamais parce que c'est un mauvais encodage. Voici donc la mise à jour de votre code avec l'aide de la méthode de EntityUtils.
OriginalL'auteur Win Myo Htet
Archimed réponse est bonne. Cependant, cela peut être fait simplement par un autre en-tête de la requête HTTP:
Pas besoin d'enlever quoi que ce soit ou d'utiliser toute autre bibliothèque.
Par exemple,
Probablement, votre demande n'a pas toute la
Accept-Charset
en-tête.OriginalL'auteur Alan Deep
Extraire le jeu de caractères de la réponse du champ type de contenu. Vous pouvez utiliser la méthode suivante pour ce faire:
Puis utilisez l'extrait du jeu de caractères pour créer le
InputStreamReader
:OriginalL'auteur Alex Goncalves