2010-11-09 38 views
2

我需要在javascript函數中將cp125 * * text轉換爲unicode utf。在javascript中將cp1252轉換爲unicode

函數將CP125 * *轉換爲utf我已經找到。

請幫助我,如果你有這個功能,謝謝!

+0

Javascript字符串是Unicode字符串。你從哪裏獲得cp1252編碼文本的格式?一個字節數組? – 2010-11-09 01:59:32

+0

所以,我剛剛加載了原始頁面html(在我的Firefox插件中),運行javascript函數,通過regexp解析這個頁面。爲了正確執行此操作,我以前需要將所有字符轉換爲utf。我可以在服務器端正確執行此操作,但不能執行此任務。 – Daniel 2010-11-09 02:06:07

回答

7

如果ISO-8859-1足夠接近,由於簡單的字節=代碼點映射,存在將ISO-8859-1-bytes-in-code-units轉換爲Unicode字符的特殊快捷方式:

var chars= decodeURIComponent(escape(bytes)); 

對於任何其他編碼沒有內置功能;你將不得不包含你自己的查找表。例如:

var encodings= { 
    // Windows code page 1252 Western European 
    // 
    cp1252: '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./:;<=>[email protected][\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\ufffd\u017d\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\ufffd\u017e\u0178\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff', 

    // Windows code page 1251 Cyrillic 
    // 
    cp1251: '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./:;<=>[email protected][\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0402\u0403\u201a\u0453\u201e\u2026\u2020\u2021\u20ac\u2030\u0409\u2039\u040a\u040c\u040b\u040f\u0452\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\u0459\u203a\u045a\u045c\u045b\u045f\xa0\u040e\u045e\u0408\xa4\u0490\xa6\xa7\u0401\xa9\u0404\xab\xac\xad\xae\u0407\xb0\xb1\u0406\u0456\u0491\xb5\xb6\xb7\u0451\u2116\u0454\xbb\u0458\u0405\u0455\u0457\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f' 
}; 

function decodeBytes(bytes, encoding) { 
    var enc= encodings[encoding]; 
    var n= bytes.length; 
    var chars= new Array(n); 
    for (var i= 0; i<n; i++) 
     chars[i]= enc.charAt(bytes.charCodeAt(i)); 
    return chars.join(''); 
} 

alert(decodeBytes('\xc7\xe4\xf0\xe0\xe2\xf1\xf2\xe2\xf3\xe9 \xec\xe8\xf0', 'cp1251')); 
// '\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439 \u043c\u0438\u0440' 
// Здравствуй мир 

ETA:

所以,我得到的原始頁面的HTML加載它只是後(在我的Firefox插件),運行的正則表達式解析這個頁面的JavaScript功能。

是的,不要這樣做。你不能用正則表達式解析HTML。

爲什麼不讓Firefox爲給定的字符集解析頁面呢?

ETA(2):

'koi8-r': '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./:;<=>[email protected][\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\u2580\u2584\u2588\u258c\u2590\u2591\u2592\u2593\u2320\u25a0\u2219\u221a\u2248\u2264\u2265\xa0\u2321\xb0\xb2\xb7\xf7\u2550\u2551\u2552\u0451\u2553\u2554\u2555\u2556\u2557\u2558\u2559\u255a\u255b\u255c\u255d\u255e\u255f\u2560\u2561\u0401\u2562\u2563\u2564\u2565\u2566\u2567\u2568\u2569\u256a\u256b\u256c\xa9\u044e\u0430\u0431\u0446\u0434\u0435\u0444\u0433\u0445\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u044f\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413\u0425\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u042f\u0420\u0421\u0422\u0423\u0416\u0412\u042c\u042b\u0417\u0428\u042d\u0429\u0427\u042a' 

(你可以抓住的單字節編碼出來的Python的映射,說像:)

>>> ''.join(map(chr, range(256))).decode('koi8-r', 'replace') 

我不知道你怎麼樣我們正在閱讀輸入流,但通常不需要手動進行這種非編程的編碼。

+0

Bobince!非常感謝你的幫助,不幸的是,它似乎在KOI8-R頁面編碼,因爲CP1252沒有得到很多幫助,使用你的功能結果仍然不可讀,但如果我wget html頁面並複製粘貼結果在瀏覽器控制檯與您的功能 - 閱讀答案是可以的。我真的很困惑這種情況:( – Daniel 2010-11-09 22:46:37

+0

@ bobince,很好的回答,我已經改進了你的decodeBytes例程,只更新0x00 - 0xff,其餘的通過: 'function decodeBytes(bytes,encoding){ return bytes。替換(/ [\ x00- \ xff]/g,函數(c)return encodings [encoding] .charAt(c.charCodeAt(0)); }); } – 2015-04-28 01:51:07