Ne peut pas analyser et afficher les caractères non-utf8 lire à partir d'une requête http
Je suis à l'aide de Java pour analyser cette demande
qui a comme résultat de cette (tronqué pour des raisons de concision) fichier JSON:
{"responseData":{"results":
<...>
"visibleUrl":"www.coolcook.net",
"cacheUrl":"http://www.google.com/search?q\u003dcache:p4Ke5q6zpnUJ:www.coolcook.net",
"title":"مطبخ مطايب - كباب الدجاج والخضار بصلصة الروب",
"titleNoFormatting":"مطبخ مطايب - كباب الدجاج والخضار بصلصة الروب","\u003drz+img+news+recordid+border"}},
<...>
"responseDetails": null, "responseStatus": 200}
Mon problème se trouve dans les caractères arabes retourné (qui peut être n'importe quel non-unicode). J'ai essayé de les convertir en arrière unicode à l'aide de quelque chose comme:
JSONArray ja = json.getJSONObject("responseData").getJSONArray("results");
JSONObject j = ja.getJSONObject(i);
str = j.getString("titleNoFormatting");
logger.log("before: " + str); //this is just my version of println
enc_str = new String (str.getBytes(), "UTF8");
logger.log("after: " + enc_str);
Cependant, le "avant" et "après", le résultat est le même: un jeu de ????'s, indépendamment de savoir si j'sortie dans le fichier journal du serveur ou dans une page HTML. Est-il une autre façon de récupérer les caractères arabes et de sortie dans une page web?
Ne JSON ont l'appui de la fonctionnalité pour ce genre de problème peut-être afin de lire le non-utf caractères directement à partir de la JSONObject?
Ce JSON API que vous utilisez?
Les caractères arabes que vous décrivez de en Unicode, et peut être représenté en UTF-8. Vous avez probablement un problème de codage sur la production, pas sur entrée.
OriginalL'auteur | 2009-11-16
Vous devez vous connecter pour publier un commentaire.
Le problème que vous avez est probablement causé par un mauvais réglage de l'encodage des caractères sur le point que vous lisez dans la réponse http à partir de google. Pouvez-vous poster le code qui est de l'URL et l'analyse dans l'objet JSON?
Comme un exemple exécuter les opérations suivantes:
C'est à l'aide de la plutôt laid standard
URL.openConnection()
qui a été autour depuis l'aube des temps. Si vous utilisez quelque chose comme Apache httpclient alors vous pouvez le faire très facilement.Pour un peu de fond de lecture sur le codage et peut-être une explication de pourquoi
new String (str.getBytes(), "UTF8");
ne fonctionnera jamais lu Joël article sur unicodeInputStreamReader()
+1 c'est vraiment m'aider .. 🙂
OriginalL'auteur Gareth Davis
Je pense que le JSON.org Java JSON package ne peut pas gérer l'utf-8, si il est passé en tant que de caractères UTF8 ou fait passer dans le
\uXXXX
code. J'ai essayé les deux, comme suit:J'obtiens:
Des idées?
Vous pouvez résoudre votre problème avec cette réponse, stackoverflow.com/a/10868238/2412686, en ajoutant le code org.apache.commons.lang3.StringEscapeUtils.unescapeJava("\\u00e9") (notez que nous utilisons une version plus récente de l'apache commons).
OriginalL'auteur Marc Hacker
La partie importante du problème est de savoir comment vous gérez le contenu de la réponse HTTP. Qui est, comment êtes-vous de la création de la
json
objet? Au moment où vous obtenez le code dans votre post original, le contenu a déjà été endommagé.Les résultats d'une requête dans codé en UTF-8 données. Comment êtes-vous l'analyse en objets JSON? Est le bon encodage spécifié pour le décodeur? Ou est votre plate-forme de codage de caractères par défaut utilisé?
OriginalL'auteur erickson
D'abord essayer ceci:
Puis ouvrez le fichier dans le bloc-notes. Si cela a l'air bien, le problème réside dans votre enregistreur ou de la console qu'il n'est pas configuré pour utiliser
UTF-8
. Reste le problème le plus probable réside dans l'API JSON que vous avez utilisé qu'il n'est pas configuré pour utiliserUTF-8
.Modifier: si le problème est, en réalité, l'API JSON utilisé et vous ne savez pas laquelle choisir, alors je vous recommande d'utiliser Gson. Il facilite vraiment la conversion d'une chaîne Json pour un facile à utiliser javabean. Voici un exemple de base:
Il génère les résultats gentiment. Espérons que cette aide.
OriginalL'auteur BalusC
Il y a un bibliothèque qui conserve l'encodage de la réponse http (tchèque expressions) avec JSon message comme ceci :
La réponse est délicate et il y a quelques points on doit prêter attention, surtout à la plate-forme d'encodage:
autant que je sache, affecte l'impression de sortir de la console, la création de fichiers à partir d'un inputstream et même de la communication entre les bases de données client et le serveur, même si elles sont toutes les deux à utiliser l'utf-8 jeu de caractères pour l'encodage - peu importe si je créer explicitement chaîne utf-8, inputstreamReader ou un ensemble de pilote JDBC pour l'UTF-8, encore à mettre en place $LANG propriété xx_XX.UTF-8 sur les systèmes linux et ajouter append=" vt.default_utf8=1" LILO boot loader (sur les systèmes qui l'utilisent), doit être faite au moins pour les systèmes de base de données et d'applications java de travail avec codé en utf-8 fichiers.
Même si j'ai ajouter ce paramètre de JVM -Dfile.encoding=UTF-8, sans la plate-forme d'encodage je n'ai pas réussi à bien le flux encodés. Ayant connecteur JDBC correctement configuré est nécessaire : "jdbc:mysql://localhost/DBname?useUnicode=true&characterEncoding=UTF8", si vous allez persister les cordes d'une base de données, qui devrait être dans cet état:
OriginalL'auteur lisak
L'API Google envoie correctement UTF-8. Je pense que le problème est que par défaut l'encodage n'est pas capable de la sortie de l'arabe. Vérifiez votre
file.encoding
de propriété ou d'obtenir de l'encodage de ce genre,Si l'encodage par défaut est l'ASCII ou Latin-1, vous obtiendrez des "?". Vous avez besoin de les changer en UTF-8.
System.out.println(Charset.defaultCharset());
Dans notre serveur, quelqu'un a fait remarquer que l'appel et a mentionné qu'il ne fonctionne pas toujours.
J'ai parlé avec plus d'un collègue à propos de ce problème. Il est vraiment fascinant. J'ai posté une nouvelle question à ce sujet: stackoverflow.com/questions/1749064/...
OriginalL'auteur ZZ Coder