Comment puis-je convertir spécial UTF-8 caractères de leurs iso-8859-1 équivalent à l'aide de javascript?
Je suis en train de faire une application javascript qui récupère .json
fichiers avec jquery et permet d'injecter des données dans la page web, il est incorporé.
La .json
fichiers sont encodés en UTF-8 et contient les caractères accentués comme é, ... et å.
Le problème est que je ne contrôlez pas le jeu de caractères sur les pages qui vont utiliser l'application.
Certains seront l'utilisation de l'UTF-8, mais d'autres seront en utilisant la norme iso-8859-1 jeu de caractères. Cela garble les caractères spéciaux de la .json
fichiers.
Comment puis-je convertir spécial UTF-8 caractères de leurs iso-8859-1 équivalent à l'aide de javascript?
Vous devez vous connecter pour publier un commentaire.
En fait, tout est stocké sous Unicode d'un genre à l'interne, mais permet de ne pas aller dans cette. Je suis en supposant que vous êtes l'obtention de l'emblématique "åäö" type de cordes parce que vous êtes à l'aide d'une ISO-8859 que votre encodage des caractères. Il y a un truc que vous pouvez faire pour convertir ces caractères. Le
escape
etunescape
fonctions utilisées pour le codage et le décodage des chaînes de requête sont définis pour l'ISO de caractères, alors que le plus récentencodeURIComponent
etdecodeURIComponent
qui font la même chose, sont définies pour les caractères UTF8.escape
code étendu ISO-8859-1 caractères (UTF points de code U+0080-U+00ff) comme%xx
(à deux chiffres hex) considérant qu'il encode en UTF codepoints U+0100 et ci-dessus comme%uxxxx
(%u
suivie de quatre chiffres hex.) Par exemple,escape("å") == "%E5"
etescape("あ") == "%u3042"
.encodeURIComponent
pour cent-encode les caractères étendus comme un UTF8 séquence d'octets. Par exemple,encodeURIComponent("å") == "%C3%A5"
etencodeURIComponent("あ") == "%E3%81%82"
.De sorte que vous pouvez faire:
Par exemple, d'une manière incorrecte caractère codé "å" devient "Ã¥". La commande ne
escape("Ã¥") == "%C3%A5"
, qui sont les deux incorrect ISO de caractères codés comme des octets. PuisdecodeURIComponent("%C3%A5") == "å"
, où les deux pour cent codé octets sont interprétées comme une UTF8 séquence.Si vous avez besoin de faire l'inverse pour une raison quelconque, qui fonctionne aussi:
Est-il un moyen de faire la différence entre mauvaise UTF8 cordes et ISO cordes? Il s'avère qu'il est. Le decodeURIComponent fonction utilisée ci-dessus renvoie une erreur si un incorrect séquence encodée. Nous pouvons l'utiliser pour détecter avec une grande probabilité que notre chaîne UTF8 ou ISO.
escape
code étendu ISO-8859-1 caractères (UTF points de code U+0080-U+00ff) comme%xx
(à deux chiffres hex) considérant qu'il encode en UTF codepoints U+0100 et ci-dessus comme%uxxxx
(%u
suivie de quatre chiffres hex.) Par exemple,escape("å") == "%E5"
etescape("あ") == "%u3042"
.encodeURIComponent
pour cent-encode les caractères étendus comme un UTF8 séquence d'octets. Par exemple,encodeURIComponent("å") == "%C3%A5"
etencodeURIComponent("あ") == "%E3%81%82"
. J'espère que efface toutes les questions.Uncaught URIError: URI malformed
Le problème est qu'une fois que la page est servi, le contenu va être dans le codage décrit dans le type de contenu de la balise meta. Le contenu de "mauvais" encoding est déjà déformé.
Vous êtes mieux de le faire sur le serveur avant de le servir jusqu'à la page. Ou comme je l'ai souvent dit: UTF-8 de bout en bout ou mourir.
En interne, les chaînes de caractères Javascript sont tous Unicode (en fait, UCS-2, un sous-ensemble de l'UTF-16).
Si vous récupérez les fichiers JSON séparément via AJAX, alors vous devez vous assurer que les fichiers JSON sont servis avec le bon Type de Contenu et le jeu de caractères:
Content-Type: application/json; charset="utf-8"
). Si vous le faites, jQuery doit déjà avoir interprété correctement par le temps de vous accédez à la désérialiser des objets.Pourriez-vous poster un exemple de code que vous utilisez pour récupérer les objets JSON?
JSON text SHALL be encoded in Unicode. The default encoding is UTF-8
. Si le réglage de l'en-tête deContent-Type: application/json; charset="iso-8859-1"
après encodage json texte à partir d'une variable d'obtenir à partir d'un fichier encodé en iso-8859-1 et de l'envoyer par ajax à une iso-8859-1 codé en html de la page produit le même résultat que de ne pas spécifier quoi que ce soit: les chaînes de caractères interprétés par le navigateur commeNULL
Depuis le question sur la façon de convertir de l'ISO-8859-1 à UTF-8 est fermée à cause de ce que je vais poster ma solution ici.
Le problème, c'est lorsque vous essayez d'OBTENIR quoi que ce soit par l'aide de XMLHttpRequest, si le XMLHttpRequest.responseType est le "texte" ou vide, XMLHttpRequest.la réponse est transformé en DOMString et c'est là que les choses se briser. Après, il est presque impossible de fiable dans cette chaîne.
Maintenant, si le contenu à partir du serveur est ISO-8859-1, vous aurez à force de la réponse de type "Blob" et, plus tard, convertir cette DOMSTring. Par exemple:
Semble que la magie se passe sur readAsBinaryString alors peut-être que quelqu'un peut faire la lumière sur pourquoi cela fonctionne.
vous devez ajouter cette ligne au-dessus de votre page