Échec de l'exécution de 'btoa" sur "Fenêtre": La chaîne contient des caractères codés à l'extérieur de la Latin1 gamme.
L'erreur dans le titre est levée que dans Google Chrome, selon mes tests. Je suis de l'encodage base64 un gros fichier XML de sorte qu'il peut être téléchargé:
this.loader.src = "data:application/x-forcedownload;base64,"+
btoa("<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+"<"+this.gamesave.tagName+">"
+this.xml.firstChild.innerHTML
+"</"+this.gamesave.tagName+">");
this.loader
est caché iframe.
Cette erreur est en fait assez un changement parce que normalement, Google Chrome serait panne sur btoa
appel. Mozilla Firefox n'a pas de problèmes ici, donc, la question est liés au navigateur.
Je ne suis pas au courant de toute caractères étranges dans le fichier. En fait, je crois que il n'y a pas de caractères non ascii.
Q:
Comment puis-je trouver la problématique des personnages et de les remplacer, de sorte que Chrome s'arrête de se plaindre?
j'ai essayé d'utiliser Downloadify pour lancer le téléchargement, mais il ne fonctionne pas. C'est pas fiable et ne renvoie pas d'erreur pour permettre le débogage.
Vous devez vous connecter pour publier un commentaire.
Si vous avez UTF8, l'utiliser (en fait, il fonctionne avec des sources SVG), comme:
exemple:
Si vous avez besoin de le décoder en base64, utilisez ceci:
Exemple:
Remarque: si vous avez besoin d'obtenir que cela fonctionne à mobile, safari, vous pourriez avoir besoin de dépouiller tous les espaces blancs de la base64 données...
2017 mise à Jour
Ce problème a été m'énerve de nouveau.
La simple vérité est, atob n'est pas vraiment gérer UTF8-cordes - c'est de l'ASCII.
Aussi, je ne voudrais pas utiliser inutilités comme js-base64.
Mais webtoolkit n'a pas une petite, agréable et très facile à entretenir mise en œuvre:
https://www.fileformat.info/info/unicode/utf8.htm
escape
convertit une chaîne en un qui ne fait que contenir des url des caractères valides. Qui empêche les erreurs.escape
etunescape
ont été désapprouvées dans le JavaScript 1.5, et on doit utiliserencodeURIComponent
oudecodeURIComponent
, respectivement, à la place. Vous utilisez le obsolète et de nouvelles fonctions. Pourquoi? Voir: w3schools.com/jsref/jsref_escape.aspbtoa(window.encodeURIComponent(unescape(str)))
travaillé maisbtoa(window.unescape(encodeURIComponent(str)))
ne fonctionne pasy = btoa(escape(x))
etx = unescape(atob(y))
. En fait, je ne vois pas comment il serait peut-être travailler dans l'ordre donné.unescape
méthode sera bientôt obsolète comme par MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...À l'aide de
btoa
avecunescape
etencodeURIComponent
ne fonctionne pas pour moi. Le remplacement de tous les caracteres spéciaux en XML/HTML entités, puis en convertissant à la représentation base64 était la seule façon de résoudre ce problème pour moi. Code:Blob
objet de gérer la conversion.Blob
peut manipuler des données binaires.J'ai juste pensé que je devais partager ce que j'ai effectivement résolu le problème et pourquoi je pense que c'est le droit solution (à condition de ne pas optimiser pour les vieux navigateur).
La conversion des données à dataURL (
data: ...
)Permettant à l'utilisateur d'enregistrer les données
En dehors de la solution la plus évidente - l'ouverture d'une nouvelle fenêtre avec votre dataURL URL que vous pouvez faire deux choses.
1. Utilisation fileSaver.js
Fichier saver pouvez créer des fileSave dialogue avec prédéfinie nom du fichier. Il peut également de secours à la normale dataURL approche.
2. Utilisation (expérimental)
URL.createObjectURL
Ce qui est excellent pour la réutilisation des données encodées en base64. Il crée une URL courte pour votre dataURL:
N'oubliez pas d'utiliser l'URL, y compris le premier
blob
préfixe. J'ai utilisédocument.body
de nouveau:Vous pouvez utiliser cette URL courte que l'AJAX cible,
<script>
source ou<a>
href emplacement. Vous êtes responsable de la destruction de l'URL si:Utiliser une bibliothèque au lieu de
Nous n'avons pas à réinventer la roue. Il suffit d'utiliser une bibliothèque d'économiser le temps et les maux de tête.
js-base64
https://github.com/dankogai/js-base64 est bon et je confirme, il prend en charge unicode très bien.
Comme un complément à Stefan Steiger réponse: (comme il n'a pas l'air gentil comme commentaire)
L'extension de la Chaîne de prototype:
Utilisation:
REMARQUE:
Comme indiqué dans les commentaires, à l'aide de
unescape
n'est pas recommandé car il peut être supprimé dans le futur:unescape
sera bientôt obsolète comme par MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...Je viens de tomber sur ce problème moi-même.
Premier, modifier votre code légèrement:
Puis utilisez votre favori de l'inspecteur web, mettre un point d'arrêt sur la ligne de code qui affecte ce.loader.src, puis exécutez ce code:
En fonction de votre application, en remplaçant les caractères qui sont hors de portée peut ou peut ne pas fonctionner, puisque vous serez en modifiant les données. Voir la note du MDN sur les caractères unicode avec la btoa méthode:
https://developer.mozilla.org/en-US/docs/Web/API/window.btoa