Question

Je dois convertir de grandes chaînes UTF-8 en ASCII. Il devrait être réversible et idéalement un algorithme rapide / léger.

Comment puis-je faire cela? J'ai besoin du code source (utilisation de boucles) ou du code JavaScript . (ne devrait dépendre d'aucune plate-forme / framework / bibliothèque)

Modifier: Je comprends que la représentation ASCII ne sera pas correcte et serait plus grande (en termes d'octets) que son homologue UTF-8, car sa forme codée est celle de l'original UTF-8. .

Était-ce utile?

La solution

Vous pouvez utiliser une version uniquement en ASCII de la fonction de citation json2.js de Douglas Crockford. Ce qui ressemblerait à ceci:

    var escapable = /[\\\"\x00-\x1f\x7f-\uffff]/g,
        meta = {    // table of character substitutions
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        };

    function quote(string) {

// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.

        escapable.lastIndex = 0;
        return escapable.test(string) ?
            '"' + string.replace(escapable, function (a) {
                var c = meta[a];
                return typeof c === 'string' ? c :
                    '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
            }) + '"' :
            '"' + string + '"';
    }

Ceci produira une chaîne valide d'entrée en langage ASCII uniquement, citée en javascript

par exemple. quote ("Doppelgänger!") sera "Doppelg \ u00e4nger!"

Pour inverser l'encodage, vous pouvez simplement évaluer le résultat

var encoded = quote("Doppelgänger!");
var back = JSON.parse(encoded); // eval(encoded);

Autres conseils

Toute chaîne UTF-8 convertible de manière réversible en ASCII est déjà ASCII.

UTF-8 peut représenter n’importe quel caractère unicode - ASCII ne le peut pas.

Comme d'autres l'ont déjà dit, vous ne pouvez pas convertir le texte / texte UTF-8 en texte / texte ASCII sans perdre de données.

Vous pouvez convertir le texte / texte UTF-8 en un autre format / ASCII. Par exemple, HTML permet à n'importe quel caractère de UTF-8 d'être représenté dans un fichier de données ASCII à l'aide de références de personnage .

Si nous continuons avec cet exemple, en JavaScript, charCodeAt pourrait aider à convertir une chaîne en une représentation à l'aide de références de caractères HTML.

Une autre approche est adoptée par URL et implémentée dans JS en tant que encodeURIComponent .

Votre exigence est assez étrange.

La conversion de UTF-8 en ASCII aurait pour effet de perdre toutes les informations sur les points de code Unicode > 127 (c'est-à-dire tout ce qui n'est pas en ASCII).

Vous pouvez toutefois essayer de coder vos données Unicode (quel que soit le codage source) dans un codage compatible ASCII, tel que UTF-7 . Cela signifierait que les données produites pourraient légalement être interprétées en tant qu'ASCII, mais il s'agit en réalité du format UTF-7.

Si la chaîne est codée au format UTF-8, ce n'est plus une chaîne. Ce sont des données binaires, et si vous voulez représenter les données binaires en ASCII, vous devez les formater en une chaîne pouvant être représentée à l'aide du jeu de caractères ASCII limité.

Une solution consiste à utiliser le codage en base 64 (exemple en C #):

string original = "asdf";
// encode the string into UTF-8 data:
byte[] encodedUtf8 = Encoding.UTF8.GetBytes(original);
// format the data into base-64:
string base64 = Convert.ToBase64String(encodedUtf8);

Si vous souhaitez que la chaîne soit codée en tant que données ASCII:

// encode the base-64 string into ASCII data:
byte[] encodedAscii = Encoding.ASCII.GetBytes(base64);

Voulez-vous supprimer tous les caractères non ascii (les remplacer par un slash par "?", etc.) ou stocker les points de code Unicode dans un système non Unicode?

Tout d'abord, vous pouvez effectuer une boucle en vérifiant les valeurs > 128 et les remplacer.

Si vous ne souhaitez pas utiliser " une plate-forme / infrastructure / bibliothèque " alors vous devrez écrire votre propre encodeur. Sinon, je n'utiliserais que le fichier .html ();

de JQuery.

Il est impossible de convertir une chaîne UTF-8 en ASCII, mais il est possible de coder en Unicode en tant que chaîne compatible ASCII.

Vous souhaitez probablement utiliser Punycode - il s'agit déjà d'un codage Unicode standard qui code tout Caractères Unicode en ASCII. Pour le code JavaScript, consultez cette question

Veuillez modifier le titre et la description de votre question afin d'empêcher les autres de voter contre elle - n'utilisez pas la conversion de termes, utilisez un codage.

Voici une fonction pour convertir les accents UTF8 en accents ASCII (àéèî etc.) S'il y a un accent dans la chaîne, il est converti en% 239 par exemple. De l'autre côté, j'analyse la chaîne et je sais quand il y a un accent et quel est le caractère ASCII.

Je l'ai utilisé dans un logiciel JavaScript pour envoyer des données à un microcontrôleur fonctionnant en ASCII.

convertUtf8ToAscii = function (str) {
    var asciiStr = "";
    var refTable = { // Reference table Unicode vs ASCII
        199: 128, 252: 129, 233: 130, 226: 131, 228: 132, 224: 133, 231: 135, 234: 136, 235: 137, 232: 138,
        239: 139, 238: 140, 236: 141, 196: 142, 201: 144, 244: 147, 246: 148, 242: 149, 251: 150, 249: 151
    };
    for(var i = 0; i < str.length; i++){
        var ascii = refTable[str.charCodeAt(i)];
        if (ascii != undefined)
            asciiStr += "%" +ascii;
        else
            asciiStr += str[i];
    }
    return asciiStr;
}

Une implémentation de la fonction quote () peut faire ce que vous voulez. Ma version est

.

Vous pouvez utiliser eval () pour inverser l'encodage:

var foo = 'Hägar';
var quotedFoo = quote(foo);
var unquotedFoo = eval(quotedFoo);
alert(foo === unquotedFoo);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top