我遇到了一个bizzaire问题,我已经查看了所有类似的问题,仍然无法解决问题。我正在使用javascript解码MIME电子邮件,并看到= C2 = A3,这意味着两个字符0xC2和0xA2来制作UTF-8英镑符号。
我在文档中设置了meta charset = UTF-8,但它仍然没有在渲染的html文档中显示为井号。页面信息表示页面呈现为UTF-8 ...如果是这样的话,为什么不是英镑符号并且显示正确?
我正在使用以下代码解码字符串:
s.replace(/=[\r\n]+/g, "").replace(/=[0-9A-F]{2}/gi, function(v) {
return String.fromCharCode(parseInt(v.substr(1), 16));
})
答案 0 :(得分:0)
答案 1 :(得分:0)
这是一种过于简单的解码算法。字节C2 A3
一起形成一个以UTF-8编码的Unicode字符; String.fromCharCode
期望单个Unicode代码点生成一个字符。连续执行两个单独的字节将不会这样做。在解码此文本时,您需要了解UTF-8编码细节,以确保将=C2=A3
一起解码为一个传递给String.fromCharCode
的数字。这可能是相当多的代码,我希望有可用于此类事物的库。
例如,请参阅here中的此代码(发布您在此处找到的后代内容):
function decodeUtf8(arrayBuffer) {
var result = "";
var i = 0;
var c = 0;
var c1 = 0;
var c2 = 0;
var data = new Uint8Array(arrayBuffer);
// If we have a BOM skip it
if (data.length >= 3 && data[0] === 0xef && data[1] === 0xbb && data[2] === 0xbf) {
i = 3;
}
while (i < data.length) {
c = data[i];
if (c < 128) {
result += String.fromCharCode(c);
i++;
} else if (c > 191 && c < 224) {
if( i+1 >= data.length ) {
throw "UTF-8 Decode failed. Two byte character was truncated.";
}
c2 = data[i+1];
result += String.fromCharCode( ((c&31)<<6) | (c2&63) );
i += 2;
} else {
if (i+2 >= data.length) {
throw "UTF-8 Decode failed. Multi byte character was truncated.";
}
c2 = data[i+1];
c3 = data[i+2];
result += String.fromCharCode( ((c&15)<<12) | ((c2&63)<<6) | (c3&63) );
i += 3;
}
}
return result;
}