Pergunta

Eu preciso converter grandes UTF-8 cordas em ASCII. Deve ser reversível, e, idealmente, um algoritmo rápido / leve.

Como posso fazer isso? Preciso do source código (usando loops) ou o JavaScript código. (Não deve ser dependente de qualquer plataforma / framework / biblioteca)

Editar: Eu entendo que a representação ASCII não vai olhar correto e seria maior (em termos de bytes) do que a sua UTF-8 contrapartida, desde a sua uma forma codificada do UTF-8 originais .

Foi útil?

Solução

Você pode usar uma versão somente ASCII da função json2.js citação de Douglas Crockford. Que ficaria assim:

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

Isso irá produzir um válido ASCII-only, javascript citado da cadeia de entrada

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

Para reverter a codificação você só pode eval o resultado

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

Outras dicas

Qualquer string UTF-8 que é reversível conversíveis em ASCII já é ASCII.

UTF-8 pode representar qualquer caractere unicode -. ASCII não pode

Como já foi dito, você não pode converter UTF-8 texto / simples em texto ASCII / plain sem deixar cair dados.

Você poderia converter UTF-8 texto / simples em ASCII someother / formato. Por exemplo, HTML permite que qualquer personagem em UTF-8 estar representando em um arquivo de dados ASCII usando referências de caráter .

Se continuarmos com esse exemplo, em JavaScript, charCodeAt poderia ajudar com a conversão de uma string para uma representação dele usando referências de caracteres HTML.

Outra abordagem é tomada por URLs , e implementado em JS como encodeURIComponent .

Sua exigência é muito estranho.

A conversão de UTF-8 para ASCII perderia todas as informações sobre codepoints Unicode> 127 (ou seja, tudo o que não está em ASCII).

Você poderia, no entanto, tentar codificar seus dados Unicode (independentemente da fonte de codificação) em uma codificação ASCII-compatível, como UTF-7 . Isto significa que os dados que são produzidos poderia legalmente ser interpretado como ASCII, mas é realmente UTF-7.

Se o texto é codificado como UTF-8, não é uma string mais. É dados binários, e se você quiser para representar os dados binários como ASCII, você tem que formatá-lo em uma seqüência que pode ser representado usando o conjunto de caracteres ASCII limitado.

Uma maneira é a utilização de base 64 codificação (exemplo em 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 você quiser a string codificada como dados ASCII:

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

Você quer retirar todos os caracteres não ascii (barra substituí-los com '?', Etc) ou para armazenar pontos de código Unicode em um sistema não unicode?

Em primeiro lugar pode ser feito em uma verificação de loop para valores> 128 e substituí-los.

Se você não quiser usar "qualquer plataforma / framework / biblioteca", então você terá que escrever o seu próprio codificador. Caso contrário, eu tinha acabado de usar .html de JQuery ();

É impossível converso uma string UTF-8 em ASCII, mas é possível codificação Unicode como uma string compatível ASCII.

Provavelmente você quiser usar Punycode - isso já é um Unicode padrão de codificação que codifica todos caracteres Unicode em ASCII. Para código JavaScript verificar esta questão href="https://stackoverflow.com/questions/183485/can-anyone-recommend-a-good-free-javascript-for-punycode-to-unicode-conversion">

Por favor edição que você pergunta título e descrição, a fim de evitar que outras pessoas down-voto-lo - não use termo conversão, o uso de codificação.

Aqui está uma função para converter acentos UTF8 para ASCII Acentos (AEEI etc) Se houver um acento na cadeia é convertida para% 239 por exemple Em seguida, do outro lado, eu analisar a cadeia e eu sei que quando há um sotaque e qual é o caractere ASCII.

Eu usei-o em um software javascript para enviar dados a um microcontrolador que funciona em 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;
}

Uma implementação da função quote() pode fazer o que quiser. Minha versão pode ser encontrada aqui

Você pode usar eval() para reverter a codificação:

var foo = 'Hägar';
var quotedFoo = quote(foo);
var unquotedFoo = eval(quotedFoo);
alert(foo === unquotedFoo);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top