2014-02-08 111 views
32

我試圖在javascript中將unicode字符串轉換爲十六進制表示形式。Javascript:將Unicode字符串轉換爲十六進制

這是我有:

function convertFromHex(hex) { 
    var hex = hex.toString();//force conversion 
    var str = ''; 
    for (var i = 0; i < hex.length; i += 2) 
     str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); 
    return str; 
} 

function convertToHex(str) { 
    var hex = ''; 
    for(var i=0;i<str.length;i++) { 
     hex += ''+str.charCodeAt(i).toString(16); 
    } 
    return hex; 
} 

但如果失敗的Unicode字符,如中國;

輸入: 漢字

輸出:?? ªo「[W

任何想法可以這樣用JavaScript來實現

回答

68

請記住,JavaScript代碼單元爲16個位寬因此。十六進制字符串形式將是每碼單元4個位數

用法:

var str = "\u6f22\u5b57"; // "\u6f22\u5b57" === "漢字" 
alert(str.hexEncode().hexDecode()); 

字符串爲十六進制形式:

String.prototype.hexEncode = function(){ 
    var hex, i; 

    var result = ""; 
    for (i=0; i<this.length; i++) { 
     hex = this.charCodeAt(i).toString(16); 
     result += ("000"+hex).slice(-4); 
    } 

    return result 
} 
再度回到

String.prototype.hexDecode = function(){ 
    var j; 
    var hexes = this.match(/.{1,4}/g) || []; 
    var back = ""; 
    for(j = 0; j<hexes.length; j++) { 
     back += String.fromCharCode(parseInt(hexes[j], 16)); 
    } 

    return back; 
} 
+0

謝謝,只是1個問題,但(可能是一個愚蠢的..) - 你如何從javascript中的漢字獲得\ u6f22 \ u5b57?最接近的是使用escape()函數,但它使用% - 我猜可以用一個正則表達式來替換%,但是escape()函數也被棄用了。 EncodeURI和encodeURIComponent都給出了不同的輸出。任何想法? – Wesley

+1

''\ u6f22 \ u5b57「'是文字''漢字''的Unicode轉義形式,就像'\ n'是換行符一樣。我傾向於使用它們來避免歧義並避免字符編碼問題。有關詳細信息,請參見[規範](http://www.ecma-international.org/publications/standards/Ecma-262.htm)。要自己生成它們,將上面的'(「000」+ hex).slice(-4)'改爲'「\\ u」+(「000」+ hex).slice(-4)'。表達式「」\ u6f22 \ u5b57「===」漢字「'評估爲真,因爲在代碼解析後它們是相同的。 – McDowell

+0

謝謝,我遇到過1個問題,有時是hex.match(//。{1,4}/g);不匹配任何東西。 (錯誤:null不是一個對象(評估hexes.length)) - 你知道可能是什麼原因嗎? – Wesley

8

how do you get "\u6f22\u5b57" from 漢字 in JavaScript?

這些都是JavaScript Unicode escape sequences e.g. \u12AB。要轉換它們,你可以迭代字符串中的每個代碼單元,在其上調用.toString(16),然後從那裏開始。

但是,儘可能在輸出中使用hexadecimal escape sequences e.g. \xAA會更有效。

另請注意,ASCII碼符號如A,b-可能不需要轉義。

我已經寫了一個小型JavaScript庫,爲您完成所有這些工作,稱爲jsesc。它有很多選項來控制輸出。

下面是工具的在線演示在行動:http://mothereff.in/js-escapes#1%E6%BC%A2%E5%AD%97


你的問題被標記爲utf-8。閱讀你的其餘問題,UTF-8編碼/解碼似乎並不是你想要的,但如果你需要它:use utf8.jsonline demo)。

+1

謝謝你的圖書館! – Wesley

5

這裏是麥克道爾的算法,不墊結果的一個調整:

function toHex(str) { 
    var result = ''; 
    for (var i=0; i<str.length; i++) { 
     result += str.charCodeAt(i).toString(16); 
    } 
    return result; 
    } 
+3

爲什麼你不想墊?現在十六進制輸出是不明確的 – Inverse

8

這取決於你用什麼編碼。如果你想爲UTF-8編碼的十六進制轉換爲字符串,使用:

function fromHex(hex,str){ 
    try{ 
    str = decodeURIComponent(hex.replace(/(..)/g,'%$1')) 
    } 
    catch(e){ 
    str = hex 
    console.log('invalid hex input: ' + hex) 
    } 
    return str 
} 

對於其他方向使用這樣的:

function toHex(str,hex){ 
    try{ 
    hex = unescape(encodeURIComponent(str)) 
    .split('').map(function(v){ 
     return v.charCodeAt(0).toString(16) 
    }).join('') 
    } 
    catch(e){ 
    hex = str 
    console.log('invalid text input: ' + str) 
    } 
    return hex 
} 
相關問題