我需要将大型UTF-8字符串转换为ASCII。它应该是可逆的,理想情况下是快速/轻量级算法。
我该怎么做?我需要源代码(使用循环)或 JavaScript 代码。 (不应该依赖于任何平台/框架/库)
编辑:据我所知,ASCII表示看起来不正确,并且比UTF-8版本更大(以字节为单位),因为它是UTF-8原版的编码形式
答案 0 :(得分:10)
任何可逆转换为ASCII的UTF-8字符串都是ASCII。
UTF-8可以表示任何unicode字符 - ASCII不能。
答案 1 :(得分:10)
您可以使用仅限ASCII版本的Douglas Crockford的json2.js引用函数。看起来像这样:
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引用的输入字符串
e.g。 quote("Doppelgänger!")
将是“Doppelg \ u00e4nger!”
要恢复编码,您只需评估结果
var encoded = quote("Doppelgänger!");
var back = JSON.parse(encoded); // eval(encoded);
答案 2 :(得分:5)
正如其他人所说,你不能在不丢弃数据的情况下将UTF-8 text / plain转换为ASCII text / plain。
您可以将UTF-8 text / plain转换为ASCII格式/格式。例如,HTML允许UTF-8中的任何字符使用character references在ASCII数据文件中表示。
如果我们继续这个例子,在JavaScript中,charCodeAt可以帮助将字符串转换为使用HTML字符引用的表示形式。
另一种方法由URLs采用,并在JS中以encodeURIComponent实现。
答案 3 :(得分:3)
你的要求很奇怪。
将UTF-8转换为ASCII将丢失有关Unicode代码点的所有信息> 127(即所有不是ASCII的东西)。
但是,您可以尝试使用ASCII兼容编码(例如UTF-7)对Unicode数据进行编码(无论采用何种源编码)。这意味着生成的数据可以合法地解释为ASCII,但它确实是UTF-7。
答案 4 :(得分:2)
如果字符串编码为UTF-8,则不再是字符串。它是二进制数据,如果要将二进制数据表示为ASCII,则必须将其格式化为可以使用有限的ASCII字符集表示的字符串。
一种方法是使用base-64编码(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);
如果您希望将字符串编码为ASCII数据:
// encode the base-64 string into ASCII data:
byte[] encodedAscii = Encoding.ASCII.GetBytes(base64);
答案 5 :(得分:0)
是否要删除所有非ascii字符(斜线替换为'?'等)或将Unicode代码点存储在非unicode系统中?
首先可以在循环中检查值> 128并替换它们。
如果您不想使用“任何平台/框架/库”,那么您需要编写自己的编码器。否则我只使用JQuery的.html();
答案 6 :(得分:0)
无法将转换 UTF-8字符串转换为ASCII,但可以将编码 Unicode作为ASCII兼容字符串。
可能你想使用Punycode - 这已经是一个标准的Unicode编码,它将所有Unicode字符编码为ASCII。对于JavaScript代码,请检查此question
请编辑您的问题标题和说明,以防止他人进行投票 - 不要使用字词转换,请使用编码。
答案 7 :(得分:0)
这是一个将UTF8重音转换为ASCII口音(àéèî等)的功能 如果字符串中有重音,则将其转换为%239作为例子 然后在另一边,我解析字符串,我知道什么时候有重音和什么是ASCII字符。
我在javascript软件中使用它将数据发送到以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;
}
答案 8 :(得分:-1)
quote()
函数的实现可能会执行您想要的操作。
我的版本can be found here
您可以使用eval()
来反转编码:
var foo = 'Hägar';
var quotedFoo = quote(foo);
var unquotedFoo = eval(quotedFoo);
alert(foo === unquotedFoo);