【问题标题】:Displaying UTF-8 in Javascript Generated HTML (e.g. pound sign)在 Javascript 生成的 HTML 中显示 UTF-8(例如井号)
【发布时间】:2015-04-11 18:53:46
【问题描述】:

我遇到了一个奇怪的问题,我查看了所有类似的问题,但仍然无法解决。我正在用 javascript 解码 MIME 电子邮件,看到 =C2=A3 这意味着两个字符 0xC2 和 0xA2 来制作 UTF-8 英镑符号。

我已经在文档中设置了 meta charset = UTF-8,但它仍然没有在呈现的 html 文档中显示为井号。 Page Info 说页面呈现为 UTF-8...如果是这种情况,为什么井号和 nbsp 不能正确显示?

我正在使用以下代码来解码字符串:

s.replace(/=[\r\n]+/g, "").replace(/=[0-9A-F]{2}/gi, function(v) {
    return String.fromCharCode(parseInt(v.substr(1), 16));
})

【问题讨论】:

  • 我正在使用下面的代码来解码字符串s:s.replace(/=[\r\n]+/g, "").replace(/=[0-9A-F]{2}/gi, function(v) { return String.fromCharCode(parseInt(v.substr(1),16)); });
  • 是的,这太简单了。字节C2 A3together 构成一个以 UTF-8 编码的 Unicode 字符; String.fromCharCode 期望单个 Unicode 代码点生成一个字符。连续做两个单独的字节不会这样做。在解码此文本时,您需要了解 UTF-8 编码细节,以确保将=C2=A3 一起解码为一个数字,然后传递给String.fromCharCode。这可能是相当多的代码,我希望已经有库可用于此类事情。
  • 感谢您的帮助 - 您刚刚解决了几天的工作!

标签: javascript encoding utf-8 mime


【解决方案1】:

在这里解码代码:

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

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

【讨论】:

  • 请在此处发布代码以供后代使用,链接容易腐烂。也许是从 MIME 文本到字符的完整解决方案,以获得加分。 ;)
【解决方案2】:

解码算法太简单了。字节C2 A3 together 构成一个以 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-19
    • 2011-07-17
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多