在Javascript生成的HTML中显示UTF-8(例如井号)

时间:2015-02-11 11:54:39

标签: javascript encoding utf-8 mime

我遇到了一个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));
})

2 个答案:

答案 0 :(得分:0)

解码代码:

https://gist.github.com/boushley/5471599

需要将一系列字节正确解码为UTF8。

答案 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;
}