Javascript 如何将大型UTF-8字符串转换为ASCII?
我需要将大的UTF-8字符串转换为ASCII。它应该是可逆的,理想情况下是一个快速/轻量级算法 我该怎么做?我需要源代码(使用循环)或JavaScript代码。(不应依赖于任何平台/框架/库)Javascript 如何将大型UTF-8字符串转换为ASCII?,javascript,utf-8,character-encoding,ascii,Javascript,Utf 8,Character Encoding,Ascii,我需要将大的UTF-8字符串转换为ASCII。它应该是可逆的,理想情况下是一个快速/轻量级算法 我该怎么做?我需要源代码(使用循环)或JavaScript代码。(不应依赖于任何平台/框架/库) 编辑:我知道ASCII表示形式看起来不正确,并且会比UTF-8对应形式大(以字节计),因为它是UTF-8原始格式的编码形式。任何可可逆转换为ASCII的UTF-8字符串都已经是ASCII UTF-8可以表示任何unicode字符—ASCII不能。正如其他人所说,如果不删除数据,就无法将UTF-8文本/纯文
编辑:我知道ASCII表示形式看起来不正确,并且会比UTF-8对应形式大(以字节计),因为它是UTF-8原始格式的编码形式。任何可可逆转换为ASCII的UTF-8字符串都已经是ASCII
UTF-8可以表示任何unicode字符—ASCII不能。正如其他人所说,如果不删除数据,就无法将UTF-8文本/纯文本转换为ASCII文本/纯文本 您可以将UTF-8文本/纯文本转换为ASCII其他格式。例如,HTML允许UTF-8中的任何字符在ASCII数据文件中使用表示 如果我们继续这个例子,在JavaScript中,可以使用HTML字符引用将字符串转换为它的表示形式
另一种方法由JS as采用,并在JS as中实现。如果字符串编码为UTF-8,它就不再是字符串了。它是二进制数据,如果您想将二进制数据表示为ASCII,则必须将其格式化为可以使用有限的ASCII字符集表示的字符串 一种方法是使用base-64编码(例如C#): 如果要将字符串编码为ASCII数据:
// encode the base-64 string into ASCII data:
byte[] encodedAscii = Encoding.ASCII.GetBytes(base64);
您可以使用Douglas Crockford的json2.js quote函数的ASCII版本。看起来是这样的:
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,javascript引用输入字符串
e、 g.quote(“Doppelgänger!”)
将是“Doppelg\u00e4nger!”
要恢复编码,您只需评估结果
var encoded = quote("Doppelgänger!");
var back = JSON.parse(encoded); // eval(encoded);
quote()
函数的实现可能会满足您的需要。
我的版本
您可以使用eval()
反向编码:
var foo = 'Hägar';
var quotedFoo = quote(foo);
var unquotedFoo = eval(quotedFoo);
alert(foo === unquotedFoo);
你的要求很奇怪 将UTF-8转换为ASCII将丢失有关Unicode代码点>127的所有信息(即非ASCII格式的所有信息)
但是,您可以尝试使用ASCII兼容编码对Unicode数据进行编码(无论源代码是什么),例如。这意味着生成的数据可以合法地解释为ASCII,但它实际上是UTF-7。是否要删除所有非ASCII字符(斜杠替换为“?”等)或在非Unicode系统中存储Unicode代码点 首先可以在循环中检查大于128的值并替换它们
如果您不想使用“任何平台/框架/库”,那么您需要编写自己的编码器。否则我只使用JQuery的.html() 不可能将UTF-8字符串转换为ASCII,但可以将Unicode编码为ASCII兼容字符串 可能您想使用-这已经是一种标准的Unicode编码,它将所有Unicode字符编码为ASCII。对于JavaScript代码,请检查以下内容
请编辑您的问题标题和说明,以防止其他人对其投反对票-不要使用术语转换,请使用编码 这里有一个将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;
}
convertUtf8ToAscii=函数(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
};
对于(变量i=0;i
我被你的编辑弄糊涂了。听起来你实际上要做的是url编码。是吗?我没有投你反对票。我不在乎UTF-8的二进制格式。如果我不知道我要的是什么,我甚至不会得到一些正确的答案。(如逃逸/BASE64),您应该考虑使用戴维的答案-<代码> EndoCuri()/代码> /Cudio> CuffDuri](<代码> > >比<代码> >(<代码> > />代码> Value>(代码)>杰瑞米,看看人们正在评论和更新您的问题,目前标题和描述非常错误。否则,您将继续获得其他人的反对票。为什么不使用eval()以外的其他工具?比如说html实体?主要是因为您不需要实现任何逆转,而且它将非常快。您也可以使用基于regex的unquote方法,非常类似于quote函数。。。或者,您可以使用正则表达式验证来保护基于eval的unquote,就像json2.js对完整JSON所做的那样。请注意,严格来说,这不是“转换为ASCII”。实际上,您正在ASCII之上实现自己的编码方案。这可能完全符合要求(对您来说也是如此),但这不仅仅是简单的“转换为ASCII”。您可以使用JSON.parse(encoded)
(在封面下类似,但更安全)“ASCII不能”-当然可以!看看上面被接受的答案。@Jeremy:那就别那么偷偷摸摸地说出你的问题吧!“UTF-8到ASCII转换”听起来像是一个字符编码转换问题,而您真正想要的是一种使用ASCII字符集和已知字符集表示Unicode(与UTF-8不同)字符的方法
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;
}