0
votes

Créer un URI de données à partir d'une chaîne Unicode

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.


1 commentaires

Vous devrez utiliser un bloc try / catch pour isoler les échecs.


3 Réponses :


0
votes

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);


2 commentaires

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 () .



0
votes

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')


6 commentaires

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



1
votes

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>


0 commentaires