2014-01-09 61 views
12

我有一个变量,包含一个由日文字符组成的字符串,例如;Javascript,将unicode字符串转换为Javascript转义?

“みどりいろ”

我怎么会去这个转换为它的JavaScript逃逸的形式?

我以后在这个例子中明确的结果是:

“\ u306f \ u3044 \ u3044 \ u308d”

我宁愿一个jQuery的方法,如果有一个变化。

+1

逃生( “みどりいろ”) –

+1

@SergeiZahharenko - '逃生( “ABC”)// “ABC”'... –

回答

22
"み".charCodeAt(0).toString(16); 

这会给你unicode(十六进制)。

String.prototype.toUnicode = function(){ 
    var result = ""; 
    for(var i = 0; i < this.length; i++){ 
     // Assumption: all characters are < 0xffff 
     result += "\\u" + ("000" + this[i].charCodeAt(0).toString(16)).substr(-4); 
    } 
    return result; 
}; 

"みどりいろ".toUnicode();  //"\u307f\u3069\u308a\u3044\u308d" 
"Mi Do Ri I Ro".toUnicode(); //"\u004d\u0069\u0020\u0044\u006f\u0020\u0052\u0069\u0020\u0049\u0020\u0052\u006f" 
"Green".toUniCode();   //"\u0047\u0072\u0065\u0065\u006e" 

演示:http://jsfiddle.net/DerekL/X7MCy/

更多:您可以通过循环运行.charCodeAt

+0

我的坏:)出于某种原因,我错过了'.toString(16)'部分 –

+0

@EladStern - 没关系。 –

+0

你可以用'('0000'+ partial).substr(-4);'替换'while(partial.length!== 4)partial =“0”+ partial;' – Adassko

4

只是

escape("みどりいろ") 

应满足大多数情况下的需求,BUF,如果您需要它以“\ u”而不是“%xx”/“%uxxxx”的形式显示,那么您可能需要使用正则表达式:

escape("みどりいろ").replace(/%/g, '\\').toLowerCase()

escape("みどりいろ").replace(/%u([A-F0-9]{4})|%([A-F0-9]{2})/g, function(_, u, x) { return "\\u" + (u || '00' + x).toLowerCase() }); 

toLowerCase是可选的,使它看起来就像是在后)

它不转义字符它不需要在大多数情况下,这可能是一个加上你;如果没有 - 请参阅Derek的回答,或者使用我的版本:

'\\u' + "みどりいろ".split('').map(function(t) { return ('000' + t.charCodeAt(0).toString(16)).substr(-4) }).join('\\u'); 
+0

Upvoted,因为它也适用(只适用于拉丁字母和普通标点符号以外的字符。) –

+0

对于U + 0000至U + 001F,U + 007F至U + 00FF范围内的字符以及各种标点符号,将失败。这些字符将'escape'd转换为'%xx'而不是'%uxxxx',这会导致无效的反斜杠转义。你需要做两个替换,一个用于'%u'到'\ u',然后一个用于'%'到'\ x'。另外'toLowerCase()'是多余的,会失去未转义字符的信息。 – bobince

+0

@bobince:你是对的,编辑 – Adassko

2

以上回答是合理的。轻微的空间和性能优化:

function escapeUnicode(str) { 
    return str.replace(/[^\0-~]/g, function(ch) { 
     return "\\u" + ("0000" + ch.charCodeAt().toString(16)).slice(-4); 
    }); 
}