【问题标题】:JavaScript encoding with Special characters带有特殊字符的 JavaScript 编码
【发布时间】:2012-11-06 09:42:01
【问题描述】:

我想编写一种方法来将特殊字符(如 'ä')转义为响应的 Unicode(例如 \u00e4)。

出于某种原因,JS 发现在内部甚至不保存 'ä' 而是使用 'üÜ' 或其他一些乱码很有趣,所以当我转换它时会吐出 '\u00c3\u00b6\u00c3\u002013' 因为它转换了这些字符而不是 'ä'。

我尝试将 HTML 文件的编码设置为 utf-8,并尝试使用 charset="UTF-8" 加载脚本,但无济于事。该代码并没有真正做任何特别的事情,但它是:

String.prototype.replaceWithUtf8 = function() {
    var str_newString = '';
    var str_procString = this;

    for (var i = 0; i < str_procString.length; i++) {
        if (str_procString.charCodeAt(i) > 126) {
            var hex_uniCode = '\\u00' + str_procString.charCodeAt(i).toString(16);
            console.log(hex_uniCode + " (" + str_procString.charAt(i) + ")");
            str_newString += hex_uniCode;
        } else {
            str_newString += str_procString.charAt(i);
        }
    }
    return str_newString;
}
var str_item = "Lärm, Lichter, Lücken, Löcher."

console.log(str_item); // Lärm, Lichter, Lücken, Löcher. 
console.log(str_item.replaceWithUtf8()); //L\u00c3\u00a4rm, Lichter, L\u00c3\u00bccken, L\u00c3\u00b6cher. 

【问题讨论】:

  • 这似乎工作正常 (jsfiddle.net/4HmgN)。您是如何在 HTML 上设置编码的?
  • 嘿@mihai,我在head-tag中这样设置:&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;
  • @mihai 等脚本标签:&lt;script type="text/javascript" charset="UTF-8" src="script/utf8.js"&gt;&lt;/script&gt;
  • 听起来不错...我在 Chrome/WinXP 中仍然得到正确的结果
  • @mihai 感谢您的尝试。我觉得被技术控制了;D

标签: javascript encoding utf-8


【解决方案1】:

我不知道如何或为什么,但我刚刚重新启动了服务器,现在它可以正确显示了。去跟随;这是所有感兴趣的人的代码:

String.prototype.replaceWithUtf8 = function() {
    var str_newString = '';
    var str_procString = this;
    var arr_replace = new Array('/', '"');
    var arr_replaceWith = new Array('\\/', '\\"');

    for (var i = 0; i < str_procString.length; i++) {
        var int_charCode = str_procString.charCodeAt(i);
        var cha_charAt = str_procString.charAt(i);
        var int_chrIndex = arr_replace.indexOf(cha_charAt);

        if (int_chrIndex > -1) {
            console.log(arr_replaceWith[int_chrIndex]);
            str_newString += arr_replaceWith[int_chrIndex];
        } else {
            if (int_charCode > 126 && int_charCode < 65536) {
                var hex_uniCode = '\\u' + ("000" + int_charCode.toString(16)).substr(-4);
                console.log(hex_uniCode + " (" + cha_charAt + ")");
                str_newString += hex_uniCode;
            } else {
                str_newString += cha_charAt;
            }
        }
    }
    return str_newString;
}

【讨论】:

    【解决方案2】:

    使用'\\u' + ('000' + str_procString.charCodeAt(i).toString(16) ).stubstr(-4); 来获得正确的转义序列 - 你的总是以00 开头。此外,.replace() 可能会更快,而不是使用 for 循环处理您的字符串。

    关于你的问题:

    console.log("Lärm, Lichter, Lücken, Löcher."); // Lärm, Lichter, Lücken, Löcher.
    

    听起来并不像您真的以正确的编码发送文件。如果已经正确保存,也可能是服务器问题。

    【讨论】:

    • 我正在关注table 中的转义序列以及 php 的 json_encode 使用的转义序列。但是你用前缀零提出了一个很好的观点。我需要正确解释这些,谢谢!
    【解决方案3】:

    String.prototype.replaceWithUtf8 = function() {
      function r(r) {
        for (var t, n, e = "", i = 0; !isNaN(t = r.charCodeAt(i++)); ) n = t.toString(16), 
        e += 256 > t ? "\\x" + (t > 15 ? "" :"0") + n :"\\u" + ("0000" + n).slice(-4);
        return e;
      }
      var a, c, o, u, s, e = "", i = this, t = [ "/", '"' ], n = [ "\\/", '\\"' ];
      for (a = 0; a < i.length; a++) c = i.charCodeAt(a), o = i.charAt(a), u = t.indexOf(o), 
      u > -1 ? e += n[u] :c > 126 && 65536 > c ? (s = r(o), e += s) :e += o;
      return e;
    };
    
    prompt("Your escaped string:","Lärm, Lichter, Lücken, Löcher.".replaceWithUtf8());
    
    alert("L\xe4rm, Lichter, L\xfccken, L\xf6cher.");

    Unicode 编码只使每个字符 6 位。但是对于 127 到 256 以上的字符,我们实际上可以用更少的字节(每个字符 4 位)使这些十六进制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      相关资源
      最近更新 更多