Come convertire grandi stringhe UTF-8 in ASCII?
-
08-07-2019 - |
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 .
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);