Domanda

Devo convertire grandi stringhe UTF-8 in ASCII. Dovrebbe essere reversibile e idealmente un algoritmo rapido / leggero.

Come posso farlo? Ho bisogno del codice sorgente (usando i loop) o del codice JavaScript . (non dovrebbe dipendere da alcuna piattaforma / framework / libreria)

Modifica: Capisco che la rappresentazione ASCII non sembrerà corretta e sarebbe più grande (in termini di byte) rispetto alla sua controparte UTF-8, poiché è una forma codificata dell'originale UTF-8 .

È stato utile?

Soluzione

È possibile utilizzare una versione solo ASCII della funzione di citazione json2.js di Douglas Crockford. Che sarebbe simile a questo:

    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 + '"';
    }

Questo produrrà un valido solo ASCII, citato da JavaScript della stringa di input

es. quote (" Doppelg & # 228; nger! ") sarà " Doppelg \ u00e4nger! "

Per ripristinare la codifica puoi semplicemente valutare il risultato

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

Altri suggerimenti

Qualsiasi stringa UTF-8 convertibile in modo reversibile in ASCII è già ASCII.

UTF-8 può rappresentare qualsiasi carattere unicode - ASCII no.

Come altri hanno già detto, non è possibile convertire il testo / plain UTF-8 in testo / plain ASCII senza eliminare i dati.

Potresti convertire UTF-8 text / plain in ASCII qualcun altro / formato. Ad esempio, HTML consente a qualsiasi carattere in UTF-8 di essere rappresentato in un file di dati ASCII usando riferimenti ai caratteri .

Se continuiamo con questo esempio, in JavaScript, charCodeAt potrebbe aiutare a convertire una stringa in una rappresentazione usando riferimenti a caratteri HTML.

Un altro approccio è adottato da URL e implementato in JS come encodeURIComponent .

Il tuo requisito è piuttosto strano.

La conversione di UTF-8 in ASCII perderebbe tutte le informazioni sui punti di codice Unicode > 127 (ovvero tutto ciò che non è in ASCII).

Puoi, tuttavia, provare a codificare i tuoi dati Unicode (indipendentemente dalla codifica sorgente) in una codifica compatibile ASCII, come UTF-7 . Ciò significherebbe che i dati prodotti potrebbero essere interpretati legalmente come ASCII, ma in realtà sono UTF-7.

Se la stringa è codificata come UTF-8, non è più una stringa. Sono dati binari e se si desidera rappresentare i dati binari come ASCII, è necessario formattarli in una stringa che può essere rappresentata utilizzando il set di caratteri ASCII limitato.

Un modo è usare la codifica base-64 (esempio in 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);

Se vuoi che la stringa sia codificata come dati ASCII:

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

Vuoi eliminare tutti i caratteri non ascii (la barra li sostituisce con '?', ecc.) o memorizzare i punti del codice Unicode in un sistema non unicode?

In primo luogo può essere fatto in un ciclo controllando i valori > 128 e sostituendoli.

Se non desideri utilizzare " nessuna piattaforma / framework / libreria " allora dovrai scrivere il tuo codificatore. Altrimenti userei solo .html ();

di JQuery

È impossibile convertire una stringa UTF-8 in ASCII ma è possibile codificare Unicode come stringa compatibile ASCII.

Probabilmente vuoi usare Punycode - questa è già una codifica Unicode standard che codifica tutto Caratteri Unicode in ASCII. Per il codice JavaScript controlla questa domanda

Modifica il titolo e la descrizione della domanda per evitare che altri lo votino verso il basso - non utilizzare la conversione del termine, utilizzare la codifica.

Ecco una funzione per convertire gli accenti UTF8 in accenti ASCII (àéèî ecc.) Se nella stringa è presente un accento, viene ad esempio convertito in% 239 Poi dall'altra parte analizzo la stringa e so quando c'è un accento e qual è il carattere ASCII.

L'ho usato in un software JavaScript per inviare dati a un microcontrollore che funziona in 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;
}

Un'implementazione della funzione quote () potrebbe fare quello che vuoi. La mia versione può essere trovata qui

Puoi usare eval () per invertire la codifica:

var foo = 'Hägar';
var quotedFoo = quote(foo);
var unquotedFoo = eval(quotedFoo);
alert(foo === unquotedFoo);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top