Como converter grandes UTF-8 cordas em ASCII?

votos
2

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

Como posso fazer isso? Eu preciso da fonte de código (usando loops) ou o JavaScript código. (não deve ser dependente de qualquer plataforma / framework / biblioteca)

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

Publicado 07/05/2009 em 13:17
fonte usuário
Em outras línguas...                            


9 respostas

votos
9

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

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

Respondeu 07/05/2009 em 13:20
fonte usuário

votos
4

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 caracteres .

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 .

Respondeu 07/05/2009 em 13:31
fonte usuário

votos
2

Se a string é 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ê quer a string codificada como dados ASCII:

// encode the base-64 string into ASCII data:
byte[] encodedAscii = Encoding.ASCII.GetBytes(base64);
Respondeu 07/05/2009 em 13:43
fonte usuário

votos
11

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ê pode apenas eval o resultado

var encoded = quote("Doppelgänger!");
var back = JSON.parse(encoded); // eval(encoded);
Respondeu 07/05/2009 em 14:02
fonte usuário

votos
0

Uma implementação da quote()função 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);
Respondeu 07/05/2009 em 14:10
fonte usuário

votos
3

Sua exigência é muito estranho.

Converter 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 os seus dados Unicode (não importa o que codificação de origem) 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.

Respondeu 07/05/2009 em 14:11
fonte usuário

votos
0

Você quer tirar todos os caracteres não ascii (Slash 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 um loop verificação de 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 ();

Respondeu 07/05/2009 em 14:14
fonte usuário

votos
0

É impossível converter uma string UTF-8 em ASCII, mas é possível codificar Unicode como uma string compatível ASCII.

Provavelmente você quiser usar Punycode - isso já é uma codificação Unicode padrão que codifica todos os caracteres Unicode em ASCII. Para código JavaScript verificar esta questão

Edite você questionar título e descrição, a fim de evitar que outras pessoas down-voto-lo - não usar termo conversão, o uso de codificação.

Respondeu 23/12/2009 em 14:38
fonte usuário

votos
0

Aqui está uma função para converter acentos UTF8 para acentos ASCII (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 acento e que é o caractere ASCII.

Usei-o em um software javascript para enviar dados para um microcontrolador que trabalha 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;
}
Respondeu 23/04/2015 em 13:35
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more