2015-02-11 47 views
0

我有一個bizzaire問題,我查看了所有類似的問題,但仍然無法解決它。我正在使用JavaScript解碼MIME電子郵件,並且看到= C2 = A3,這意味着兩個字符0xC2和0xA2可以使UTF-8英國英鎊符號成爲可能。在JavaScript中顯示UTF-8生成的HTML(例如英鎊符號)

我已經在文檔中設置了meta charset = UTF-8,但它仍然不會在呈現的html文檔中顯示爲井號。頁面信息表示頁面呈現爲UTF-8 ...如果情況是這樣,爲什麼英鎊符號和nbsp顯示不正確?

我用下面的代碼串進行解碼:

s.replace(/=[\r\n]+/g, "").replace(/=[0-9A-F]{2}/gi, function(v) { 
    return String.fromCharCode(parseInt(v.substr(1), 16)); 
}) 
+0

我用下面的代碼來解碼字符串s: 's.replace(/ = [0-9A-F] {2}/gi,函數(v)返回String.fromCharCode(parseInt(v.substr(1)= [\ r \ n] +/),16)); });' – user3780104 2015-02-11 13:08:00

+0

是的,那太簡單了。字節'C2 A3' *一起*組成一個以UTF-8編碼的Unicode字符; 'String.fromCharCode'需要一個Unicode代碼點來生成一個字符。在一行中做兩個單獨的字節不會這樣做。在解碼此文本時,您需要了解UTF-8編碼細節,以確保將「= C2 = A3」解碼爲一個數字,並將其傳遞給String.fromCharCode。這可能是相當多的代碼,我希望有這樣的庫已經可用。 – deceze 2015-02-11 13:22:10

+0

gotcha感謝您的幫助 - 您剛剛解決了幾天的工作! – user3780104 2015-02-11 13:29:23

回答

0

解碼代碼在這裏:

https://gist.github.com/boushley/5471599

字節序列需要正確解碼爲UTF8。

+0

請在這裏發佈代碼,爲後代,鏈接傾向於腐爛。也許是從MIME文本到字符的完整解決方案以獲得額外的分數。 ;) – deceze 2015-02-11 13:38:41

+0

我已經將此代碼添加爲完整的自包含答案... – deceze 2015-02-12 00:32:35

0

這太簡單瞭解碼算法。字節C2 A3合在一起構成一個以UTF-8編碼的Unicode字符; String.fromCharCode需要一個Unicode代碼點來生成一個字符。在一行中做兩個單獨的字節不會這樣做。在解碼此文本時,您需要了解UTF-8編碼細節,以確保您將=C2=A3解碼爲一個數字,並將其傳遞給String.fromCharCode。這可能是相當多的代碼,我希望有這樣的庫可用。

例如,看到here代碼(張貼你在這裏找到了爲後人):

function decodeUtf8(arrayBuffer) { 
    var result = ""; 
    var i = 0; 
    var c = 0; 
    var c1 = 0; 
    var c2 = 0; 

    var data = new Uint8Array(arrayBuffer); 

    // If we have a BOM skip it 
    if (data.length >= 3 && data[0] === 0xef && data[1] === 0xbb && data[2] === 0xbf) { 
    i = 3; 
    } 

    while (i < data.length) { 
    c = data[i]; 

    if (c < 128) { 
     result += String.fromCharCode(c); 
     i++; 
    } else if (c > 191 && c < 224) { 
     if(i+1 >= data.length) { 
     throw "UTF-8 Decode failed. Two byte character was truncated."; 
     } 
     c2 = data[i+1]; 
     result += String.fromCharCode(((c&31)<<6) | (c2&63)); 
     i += 2; 
    } else { 
     if (i+2 >= data.length) { 
     throw "UTF-8 Decode failed. Multi byte character was truncated."; 
     } 
     c2 = data[i+1]; 
     c3 = data[i+2]; 
     result += String.fromCharCode(((c&15)<<12) | ((c2&63)<<6) | (c3&63)); 
     i += 3; 
    } 
    } 
    return result; 
}