Necesito convertir cadenas UTF-8 grandes en ASCII. Debería 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.

4
Robinicks 7 may. 2009 a las 16:17

9 respuestas

La mejor respuesta

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, entre comillas javascript, de la cadena de entrada.

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

Para revertir la codificación, solo puede evaluar el resultado

var encoded = quote("Doppelgänger!");
var back = JSON.parse(encoded); // eval(encoded);
10
Tracker1 21 ene. 2015 a las 18:13

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

Puede convertir UTF-8 text / plain a ASCII someother / format. 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 con la conversión de una cadena a una representación de ella utilizando referencias de caracteres HTML.

URLs adopta otro enfoque e implementa en JS como encodeURIComponent.

5
Quentin 7 may. 2009 a las 12:31

Una implementación de la función quote() podría hacer lo que quieras. 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);
-1
Christoph 4 sep. 2018 a las 16:49

Aquí hay una función para convertir acentos UTF8 a acentos ASCII (àéèî, 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 qué es el ASCII char.

Lo usé 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;
}
0
Francois Girard 23 abr. 2015 a las 13:35

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

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

10
Neall 7 may. 2009 a las 12:20

Su requerimiento 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 es UTF-7.

3
Joachim Sauer 17 jun. 2010 a las 18:22

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

Probablemente quiera usar Punycode: esta es una codificación Unicode estándar que codifica todos los 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.

0
Community 23 may. 2017 a las 12:17

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);
2
Guffa 7 may. 2009 a las 12:43

¿Desea quitar 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 reemplazándolos.

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

0
Fowl 7 may. 2009 a las 13:14