2014-01-09 103 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); 
    }); 
}