Como converter grandes UTF-8 cordas em ASCII?
-
08-07-2019 - |
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 .
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);