2012-11-06 84 views
4

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

出于某种原因,JS认为有一件有趣的事情甚至不救的“a”内部,但使用“üÜ”或其他一些断章取义,所以当我把它转换吐出“\ 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. 
+0

这似乎是工作正常(http://jsfiddle.net/4HmgN/)。你是如何在HTML上设置编码的? – mihai

+0

嗨@mihai,我在head-tag中设置了它: '' – ProudOne

+0

@mihai and like所以在脚本标签: '' – ProudOne

回答

2

使用'\\u' + ('000' + str_procString.charCodeAt(i).toString(16)).stubstr(-4);,而不是得到正确的转义序列 - 你不要总是00开始。此外,而不是一个for-loop处理你的字符串,.replace()可能会更快。

关于你的问题:

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

不健全,你真的发送的文件与正确的编码。可能是服务器问题,如果它已被正确保存。

+0

我在这个[table](http://www.utf8-zeichentabelle.de/unicode-utf8-table.pl?utf8=dec)中跟踪转义序列,以及那些php的json_encode使用。但你用前缀的零作出了一个很好的观点。我需要正确解释这些,谢谢! – ProudOne

2

我不知道如何或为何,但我只是再次重新启动服务器,现在它的正确显示。去跟随;这里是谁的兴趣给大家代码:

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; 
} 
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位)来生成这些十六进制数。