jQuery AJAX appel bousille l'encodage des caractères
J'ai une servlet qui sorties JSON. L'encodage de sortie pour la servlet est ISO-8859-1. Pages dans notre application sont également fixés à la norme ISO-8859-1. Je voudrais utiliser l'UTF-8, mais c'est hors de mon contrôle; nous devons utiliser ISO-8859-1.
Quand j'ai frappé la servlet par lui-même, je peux voir les données JSON qui a été sorti. Le codage des caractères est correct, et aucun des personnages paraissent étranges.
Cependant, lorsque j'appelle la servlet via AJAX et d'utiliser les données extraites pour remplir une boîte de sélection, je reçois � à la place de (paraît-il) tous les caractères qui ont des accents (j'ai par exemple avec de graves ou d'accent aigu, diérèse, ou circonflexe). Quand je regarde la réponse dans l'onglet Net sous Firebug, je vois que ce que le texte a l'air bien. Cependant, lorsque j'utilise que les données pour remplir la boîte de sélection, j'ai le diamant-avec-questionmark.
Ces personnages sont tous valides ISO-8859-1 caractères, et donc je ne comprends pas pourquoi ils n'apparaissent pas correctement.
MODIFIER
Certains plus d'informations. J'utilise GET
dans jQuery.ajax
et j'ai mis scriptCharset
à ISO-8859-1
. Sur le côté serveur, j'ai explicitement définir l'encodage ISO-8859-1 en utilisant request.setCharacterEncoding("ISO-8859-1");
MODIFIER
Des exemples de Code:
C'est ce que j'ai actuellement. J'ai ajouté scriptCharset: "ISO-8859-1"
pas d'effet.
jQuery.ajax({
url: "/countryAndProvinceCodeServlet",
data: data,
dataType: "json",
type: "GET",
success: function(data) {
...
},
});
Ma servlet utilise org.json.JSONObject
et simplement sorties de la chaîne en faisant response.getWriter().print(jsonObject.toString());
Mise à JOUR
Par les commentaires sur JSON, et comment il doit être en UTF-8, j'ai essayé de voir si je pouvais saisir les données sous forme de texte (donc définir dataType
à text
dans jQuery.ajax
), puis de l'évaluer comme JSON moi-même (en Javascript). Cela ne semble pas fonctionner non plus! Quand je fais console.log
, j'ai toujours l'funky diamants. Cependant, quand je la regarde sous l'onglet réseau de Firebug tout s'affiche correctement:
Onglet Net:
{"error":false,
"provinces":{"DZ-01":"Adrar",
"DZ-16":"Alger",
"DZ-23":"Annaba",
"DZ-44":"Aïn Defla",
"DZ-46":"Aïn Témouchent",
"DZ-05":"Batna",
"DZ-07":"Biskra",
"DZ-09":"Blida",
"DZ-34":"Bordj Bou Arréridj",
"DZ-10":"Bouira",
"DZ-35":"Boumerdès",
"DZ-08":"Béchar",
"DZ-06":"Béjaïa",
"DZ-02":"Chlef",
"DZ-25":"Constantine",
"DZ-17":"Djelfa",
"DZ-32":"El Bayadh",
"DZ-39":"El Oued",
"DZ-36":"El Tarf",
"DZ-47":"Ghardaïa",
"DZ-24":"Guelma",
"DZ-33":"Illizi",
"DZ-18":"Jijel",
"DZ-40":"Khenchela",
"DZ-03":"Laghouat",
"DZ-29":"Mascara",
"DZ-43":"Mila",
"DZ-27":"Mostaganem",
"DZ-28":"Msila",
"DZ-26":"Médéa",
"DZ-45":"Naama",
"DZ-31":"Oran",
"DZ-30":"Ouargla",
"DZ-04":"Oum el Bouaghi",
"DZ-48":"Relizane",
"DZ-20":"Saïda",
"DZ-22":"Sidi Bel Abbès",
"DZ-21":"Skikda",
"DZ-41":"Souk Ahras",
"DZ-19":"Sétif",
"DZ-11":"Tamanghasset",
"DZ-14":"Tiaret",
"DZ-37":"Tindouf",
"DZ-42":"Tipaza",
"DZ-38":"Tissemsilt",
"DZ-15":"Tizi Ouzou",
"DZ-13":"Tlemcen",
"DZ-12":"Tébessa"}}
Mais quand je fais console.log(text)
avec ce que je reçois de jQuery.ajax
, je reçois le texte suivant:
{"error":false,
"provinces":{"DZ-01":"Adrar",
"DZ-16":"Alger",
"DZ-23":"Annaba",
"DZ-44":"A�n Defla",
"DZ-46":"A�n T�mouchent",
"DZ-05":"Batna",
"DZ-07":"Biskra",
"DZ-09":"Blida",
"DZ-34":"Bordj Bou Arr�ridj",
"DZ-10":"Bouira",
"DZ-35":"Boumerd�s",
"DZ-08":"B�char",
"DZ-06":"B�ja�a",
"DZ-02":"Chlef",
"DZ-25":"Constantine",
"DZ-17":"Djelfa",
"DZ-32":"El Bayadh",
"DZ-39":"El Oued",
"DZ-36":"El Tarf",
"DZ-47":"Gharda�a",
"DZ-24":"Guelma",
"DZ-33":"Illizi",
"DZ-18":"Jijel",
"DZ-40":"Khenchela",
"DZ-03":"Laghouat",
"DZ-29":"Mascara",
"DZ-43":"Mila",
"DZ-27":"Mostaganem",
"DZ-28":"Msila",
"DZ-26":"M�d�a",
"DZ-45":"Naama",
"DZ-31":"Oran",
"DZ-30":"Ouargla",
"DZ-04":"Oum el Bouaghi",
"DZ-48":"Relizane",
"DZ-20":"Sa�da",
"DZ-22":"Sidi Bel Abb�s",
"DZ-21":"Skikda",
"DZ-41":"Souk Ahras",
"DZ-19":"S�tif",
"DZ-11":"Tamanghasset",
"DZ-14":"Tiaret",
"DZ-37":"Tindouf",
"DZ-42":"Tipaza",
"DZ-38":"Tissemsilt",
"DZ-15":"Tizi Ouzou",
"DZ-13":"Tlemcen",
"DZ-12":"T�bessa"}}
Il me semble que jQuery est en train de faire quelque chose de bizarre avec les données.
Juste mis à jour à ma question. Oui, les en-têtes de dire ISO-8859-1. Quand je vérifie sur la page d'info dans Firefox, il dit " ISO-8859-1.
Voir aussi: stackoverflow.com/questions/26620/...
essayé aussi. Malheureusement, ne fonctionne toujours pas 🙁
OriginalL'auteur Vivin Paliath | 2010-07-07
Vous devez vous connecter pour publier un commentaire.
J'ai enfin compris. C'est assez bizarre!
response.setCharacterEncoding(String)
ne pas de travail (je ne sais pas si c'est lié à ma configuration ou quoi). On dirait qu'il définit le codage des caractères, mais pour certaines raisons, jQuery, les dégâts de tous. Vous avez le définir explicitement les en-têtes de la sorte:Merci pour toute l'aide, tout le monde!
MODIFIER
J'ai fait quelques recherches et vérifié les La documentation javadoc et vu ce:
Ci-dessus fonctionne toujours, mais vous pouvez aussi (et devrait) faire:
OriginalL'auteur Vivin Paliath
Pouvez-vous utiliser l'UTF-8, à la place?
En PHP, vous pouvez encoder les données JSON en UTF-8:
J'ai vu de drôles de résultats en utilisant la norme ISO-8859-1 jeu de caractères accentués. J'ai changé pour de l'UTF-8 et les problèmes d'encodage disparu.
Pour ce que ça vaut, j'ai codé
getJSON
comme suit:merci à tous pour votre aide, j'ai tout compris. Il était lié à une question que vous avez associé dans les commentaires (sur la définition des en-têtes explicitement). Je suppose que le paramétrage de l'encodage de caractère sera la même, mais apparemment pas!
OriginalL'auteur Dave Jarvis
Il me semble que vous recevez une erreur d'analyse car les données de réponse sont mal décodé et ainsi de contenir certains caractères incorrects.
Vous pourriez essayer de l'insérer dans jQuery.ajax un paramètre supplémentaire
Si vous avez mal, mais différents caractères pour tous les caractères non-ASCII ('ï', 'é' et ainsi de suite), vous pouvez essayer de remplacer les mauvais caractères codés pour les caractères corrects et le retour de corriger les données codées à partir de la
dataFilter
.Je ne suis pas d'écrire des programmes en java, donc je pourrais aider sur le côté serveur. Mais avez-vous tous les caractères non-ASCII à l'intérieur de
dataFilter
que le même personnage comme � ou les caractères sont différents (endata
paramètre d'entrée)?Oui, j'ai eu tous les caractères non ascii comme � à l'intérieur de
dataFilter
. Le problème réel est que les en-têtes ont été définies de manière incorrecte. Les personnages ont été codées à droite, mais le jeu de caractères est toujours en UTF8. J'ai dû mettre le type d'application, puis définir le codage des caractères, pour le jeu de caractères de bâton.OriginalL'auteur Oleg
RFC 4627 états qui JSON texte EST encodé en Unicode, quoi que cela signifie, et json.org indique que tous les caractères unicode des caractères":
Encodage
JSON texte EST encodé en Unicode. L'encodage par défaut est
UTF-8.
Depuis les deux premiers caractères d'un texte JSON sera toujours ASCII
les caractères [RFC0020], il est possible de déterminer si un octet
le flux est de l'UTF-8, UTF-16 (ou LE), ou UTF-32 (ou LE) par la recherche
le modèle de la valeur null dans les quatre premiers octets.
Donc, si vous êtes le transfert de JSON et dire que c'est de l'ISO-8859-1 alors différents JSON bibliothèques peuvent interpréter la clause de la RFC définit JSON, de diverses façons, par exemple par codant pour le caractère de remplacement ou en masquant l'encodage. La meilleure façon est évidemment à prendre cela pour tout ce qui est hors de votre contrôle et leur dire d'y remédier 🙂
Solutions de contournement
Une façon de contourner cela est de créer un filtre de servlet qui supprime tous les caractères qui sont incompatibles à la fois avec de l'UTF-8 et ISO-8859-1 et de les remplacer avec JSON échappe:
Dans le fragment suivant, remplacer les " é " par "\u00E9", de sorte que toute récidive ISO-8859-1 personnage est transporté en toute sécurité dans les 7 bits qui sont identiques:
Avant:
{ "a" : "éte" }
Après:
{ "a" : "\u00E9te" }
Il n'est pas lisible, mais sémantiquement parlant, c'est la même chose, et de toute bonne librairie JSON doit les traiter de la même manière.
OriginalL'auteur mogsie
La fonction php json_encode ne prend pas en charge la norme ISO-8859-1 données codées.
Cet article peut vous aider avec votre problème: http://www.pabloviquez.com/2009/07/json-iso-8859-1-and-utf-8-%E2%80%93-part2/
OriginalL'auteur phixr
si vous souhaitez données récupérées à partir de la base de données, vous devez écrire en vertu de ces phrases dans la page envoyer la demande de l'ajax page. Par exemple, si vous écrivez HTML et AJAX code dans la page "A" et envoyer des variables à partir du code java à la page "B", écrivent ces codes dans la page "B".
ne pas oublié votre base de données doit être en mode unicode comme "utf8_general_ci".
;
J'ai écrit ces phrase de la langue persane, vous pouvez la modifier.
$conn
est une variable pour se connecter à table spécifiée dans la base de données de MySQL.OriginalL'auteur Jamal Azizbeigi