我需要将大量的UTF-8字符串转换为ASCII。这个过程应该是可逆的,并且最好使用一个快速/轻量级的算法。
我应该怎么做?我需要源代码(使用循环)或JavaScript代码。(不应依赖于任何平台/框架/库)
编辑: 我理解ASCII表示形式看起来不正确,而且比其UTF-8原始格式更大(以字节计)。因为它是UTF-8原始格式的编码形式。
我需要将大量的UTF-8字符串转换为ASCII。这个过程应该是可逆的,并且最好使用一个快速/轻量级的算法。
我应该怎么做?我需要源代码(使用循环)或JavaScript代码。(不应依赖于任何平台/框架/库)
编辑: 我理解ASCII表示形式看起来不正确,而且比其UTF-8原始格式更大(以字节计)。因为它是UTF-8原始格式的编码形式。
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 + '"';
}
这将产生一个有效的ASCII-only、javascript-quoted输入字符串的结果
例如:quote("Doppelgänger!")
将会是 "Doppelg\u00e4nger!"
要恢复编码,您只需对结果进行eval操作即可。
var encoded = quote("Doppelgänger!");
var back = JSON.parse(encoded); // eval(encoded);
JSON.parse(encoded)
代替eval(encoded)
(在底层实现上类似,但更安全)。 - Tracker1任何可逆地转换为ASCII的UTF-8字符串已经是ASCII了。
UTF-8可以表示任何Unicode字符,而ASCII则不能。
正如其他人所说,你无法将UTF-8 text/plain转换为ASCII text/plain而不丢失数据。
你可以将UTF-8 text/plain转换为其他格式的ASCII。例如,HTML允许使用字符引用在ASCII数据文件中表示UTF-8中的任何字符。
如果我们继续以这个例子为例,在JavaScript中,charCodeAt可以帮助将字符串转换为使用HTML字符引用表示的字符串。
URLs采用了另一种方法,并在JS中实现为encodeURIComponent。
你的需求非常奇怪。
将UTF-8转换为ASCII会丢失有关Unicode代码点> 127(即不在ASCII中的所有内容)的所有信息。
但是,您可以尝试使用与ASCII兼容的编码(例如 UTF-7)对Unicode数据进行编码。这意味着生成的数据可以合法地解释为ASCII,但实际上它是UTF-7。
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);
如果您想将字符串编码为ASCII数据:
// encode the base-64 string into ASCII data:
byte[] encodedAscii = Encoding.ASCII.GetBytes(base64);
function utf8ToAscii(str) {
/**
* ASCII contains 127 characters.
*
* In JavaScript, strings is encoded by UTF-16, it means that
* js cannot present strings which charCode greater than 2^16. Eg:
* `String.fromCharCode(0) === String.fromCharCode(2**16)`
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMString/Binary
*/
const reg = /[\x7f-\uffff]/g; // charCode: [127, 65535]
const replacer = (s) => {
const charCode = s.charCodeAt(0);
const unicode = charCode.toString(16).padStart(4, '0');
return `\\u${unicode}`;
};
return str.replace(reg, replacer);
}
也可以查看JavaScript中将Uint8Array转换为字符串。您可以使用TextEncoder
和Uint8Array
:
function utf8ToAscii(str) {
const enc = new TextEncoder('utf-8');
const u8s = enc.encode(str);
return Array.from(u8s).map(v => String.fromCharCode(v)).join('');
}
// For ascii to string
// new TextDecoder().decode(new Uint8Array(str.split('').map(v=>v.charCodeAt(0))))
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;
}
实现quote()
函数可能会达到你想要的效果。我的版本在这里。
你可以使用eval()
来反向编码:
var foo = 'Hägar';
var quotedFoo = quote(foo);
var unquotedFoo = eval(quotedFoo);
alert(foo === unquotedFoo);
encodeURI()
/decodeURI()
比quote()
/eval()
更适合解决你的问题。 - Christoph