Pregunta

Necesito convertir cadenas UTF-8 grandes en ASCII. Debe ser reversible e idealmente un algoritmo rápido / ligero.

¿Cómo puedo hacer esto? Necesito el código fuente (usando bucles) o el código JavaScript . (no debe depender de ninguna plataforma / marco / biblioteca)

Editar: entiendo que la representación ASCII no se verá correcta y sería más grande (en términos de bytes) que su contraparte UTF-8, ya que es una forma codificada del original UTF-8 .

¿Fue útil?

Solución

Puede usar una versión solo ASCII de la función de cotización json2.js de Douglas Crockford. Que se vería así:

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

Esto producirá un código ASCII válido, solo con comillas javascript de la cadena de entrada

p. quote (" Doppelgänger! ") será " Doppelg \ u00e4nger! "

Para revertir la codificación, puede evaluar el resultado

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

Otros consejos

Cualquier cadena UTF-8 que sea reversiblemente convertible a ASCII ya es ASCII.

UTF-8 puede representar cualquier carácter unicode; ASCII no puede.

Como han dicho otros, no puede convertir texto / sin formato UTF-8 en texto / sin formato ASCII sin soltar datos.

Puede convertir texto UTF-8 / sin formato a ASCII otro / formato. Por ejemplo, HTML permite que cualquier carácter en UTF-8 se represente en un archivo de datos ASCII usando referencias de caracteres .

Si continuamos con ese ejemplo, en JavaScript, charCodeAt podría ayudar a convertir una cadena en una representación de ella utilizando referencias de caracteres HTML.

URLs adopta otro enfoque e implementa en JS como encodeURIComponent .

Su requisito es bastante extraño.

La conversión de UTF-8 en ASCII perdería toda la información sobre los puntos de código Unicode > 127 (es decir, todo lo que no está en ASCII).

Sin embargo, podría intentar codificar sus datos Unicode (sin importar la codificación de origen) en una codificación compatible con ASCII, como UTF-7 . Esto significaría que los datos que se producen podrían interpretarse legalmente como ASCII, pero en realidad son UTF-7.

Si la cadena está codificada como UTF-8, ya no es una cadena. Son datos binarios, y si desea representar los datos binarios como ASCII, debe formatearlos en una cadena que pueda representarse utilizando el conjunto de caracteres ASCII limitado.

Una forma es usar la codificación base-64 (ejemplo 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 desea que la cadena se codifique como datos ASCII:

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

¿Desea eliminar todos los caracteres no ascii (barra inclinada reemplazarlos con '?', etc.) o almacenar puntos de código Unicode en un sistema no unicode?

Primero se puede hacer en un bucle buscando valores > 128 y reemplazarlos.

Si no desea utilizar " cualquier plataforma / framework / biblioteca " entonces necesitará escribir su propio codificador. De lo contrario, simplemente usaría .html () de JQuery;

Es imposible convertir una cadena UTF-8 en ASCII, pero es posible codificar Unicode como una cadena compatible con ASCII.

Probablemente quiera usar Punycode : esta es una codificación Unicode estándar que codifica todo Caracteres Unicode en ASCII. Para el código JavaScript, verifique esta pregunta

Edite el título y la descripción de su pregunta para evitar que otros la voten negativamente; no use la conversión de términos, use la codificación.

Aquí hay una función para convertir acentos UTF8 en acentos ASCII (& # 224; & # 233; & # 232; & # 238; etc.) Si hay un acento en la cadena, se convierte a% 239 por ejemplo Luego, en el otro lado, analizo la cadena y sé cuándo hay un acento y cuál es el carácter ASCII.

Lo utilicé en un software javascript para enviar datos a un microcontrolador que funciona 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;
}

Una implementación de la función quote () podría hacer lo que desee. Mi versión se puede encontrar aquí

Puede usar eval () para invertir la codificación:

var foo = 'Hägar';
var quotedFoo = quote(foo);
var unquotedFoo = eval(quotedFoo);
alert(foo === unquotedFoo);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top