J'essaye de faire en sorte que JavaScript télécharge une chaîne Unicode sous forme de fichier texte. J'en suis au point où j'ai besoin de convertir la chaîne Unicode en une URL de données, afin que l'utilisateur puisse ouvrir l'URL et télécharger le fichier. Voici une simplification de mon code:
var myString = "âæ´ê´î«ïã¥ä¯ì±»å·ï¡Üèæì ê²åè´ì§¥åಽí¾æã©ï¢î·äºæ칡⡴ì³éå½å«á¯ï¿½"; var link = document.createElement('a'); link.setAttribute('href', 'data:text/plain;base64,' + myString);
Je ne sais pas quel jeu de caractères utiliser ni comment encoder ma chaîne - j'ai essayé des combinaisons de encodeURI () code> et
btoa ()
, mais je n'ai rien réussi à faire fonctionner. encodeURI ()
me donne l'erreur Uncaught URI Error: URI malformé
pour certains caractères comme U + da7b
.
Je préférerais que le fichier final téléchargé ait les mêmes caractères que la chaîne initiale.
3 Réponses :
Vous pouvez essayer de définir l'attribut de téléchargement et d'utiliser le encodage d'URL avec texte / brut .
const myString = 'âæ´ê´î«ïã¥ä¯ì±»å·ï¡Üèæì ê²åè´ì§¥åಽí¾æã©ï¢î·äºæ칡⡴ì³éå½å«á¯ï¿½'; const link = document.createElement('a'); link.setAttribute('download', 'filename'); link.append("Download!"); link.setAttribute('href', 'data:,' + encodeURI(myString)); document.body.appendChild(link);
En fait, après une enquête plus approfondie, certains caractères comme U + DA7B
(stackoverflow ne me laisse pas télécharger le caractère réel) me donnent l'erreur: Uncaught URI Error: URI malformé
.
encodeURI ()
attend un URI entier en entrée, mais myString
n'est pas un URI. Essayez plutôt d'utiliser encodeURIComponent ()
.
Cela fonctionne pour moi
decodeURIComponent(atob(btoa(encodeURIComponent("ä¸æ")))) // Output: ä¸æ
Et pour votre cas sur \ uDA7B
, cela échoue car c'est l'un des substituts les plus élevés (D800-DBFF), il n'a de sens que lorsqu'il est utilisé dans le cadre d'une paire de substitution.
C'est pourquoi vous avez l'erreur URIError lorsque vous le faites
encodeURIComponent ('\ uDA7B') // ERROR code>
Associez-le à un caractère des substituts bas (DC00-DFFF) et cela fonctionne:
encodeURIComponent ('\ uDA7B \ uDC01')
Vous n'avez pas besoin d'encoder le texte par URL avant de l'encoder en base64. Mais vous devez d'abord vous assurer que le texte est encodé dans le jeu de caractères, par exemple en UTF-8, puis vous pouvez spécifier ce jeu de caractères dans l'url data:
.
@RemyLebeau comment faire un texte encodé? J'utilise toujours encodeURIComponent
bcz c'est le moyen le plus simple de convertir quoi que ce soit en jeu de caractères Latin1
encodeURIComponent ()
charset-encode le texte en UTF-8 puis url-encode les octets UTF-8. Pour une URL data:
, le codage d'URL n'est pas nécessaire lors de l'utilisation de base64.
Donc, si je ne veux que l'encodage de charset, je devrais essayer quelque chose comme la nouvelle API Encoder? developer.mozilla.org/en-US/docs/Web/API/ TextEncoder
Vous pouvez l'utiliser pour obtenir un tableau d'octets UTF-8, oui. Mais, en base64, vous devrez ensuite copier les octets dans une chaîne
car btoa ()
ne prend pas un tableau d'octets en entrée.
merci;) Je ne savais pas que l'API était disponible jusqu'à aujourd'hui
Vous n'avez pas besoin d'utiliser base64 lorsque vous utilisez du texte dans un data:
URL , il suffit de coder le texte en pourcentage, par exemple:
var link = document.createElement('a'); link.setAttribute('href', 'data:text/plain;charset=UTF-8;base64,' + btoa(unescape(encodeURIComponent(myString))));
encodeURIComponent ()
charset -encode le texte en UTF-8, puis url-encode les octets UTF-8, d'où l'inclusion de charset = UTF-8
dans l'URL data:
.
Mais, si vous voulez toujours utiliser base64, vous n'avez pas besoin d'encoder le texte en url. Encodez simplement le jeu de caractères en octets, puis encodez les octets en base64 et spécifiez le jeu de caractères utilisé dans l'URL data:
, par exemple:
var link = document.createElement('a'); link.setAttribute('href', 'data:text/plain;charset=UTF-8,' + encodeURIComponent(myString));
p>
Vous devrez utiliser un bloc
try
/catch
pour isoler les échecs.