5

我想编写一种方法来将特殊字符(如“ä”)转义为响应的 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. 
4

3 回答 3

3

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

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;
}
于 2012-11-06T12:03:51.183 回答
2

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

关于你的问题:

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

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

于 2012-11-06T12:10:58.527 回答
0

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 位)使这些十六进制。

于 2015-08-21T14:04:16.077 回答