3 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊
實(shí)際上,所有內(nèi)容通常都在內(nèi)部以某種Unicode形式存儲(chǔ),但不要贅述。我假設(shè)您正在使用標(biāo)志性的“?¥?¤??”類型字符串,因?yàn)槟褂玫氖荌SO-8859作為字符編碼。您可以采取一種技巧來轉(zhuǎn)換這些字符。用于編碼和解碼查詢字符串的escape和unescape函數(shù)是為ISO字符定義的,而較新的encodeURIComponent和decodeURIComponent功能相同的函數(shù)是為UTF8字符定義的。
escape將擴(kuò)展的ISO-8859-1字符(UTF代碼點(diǎn)U + 0080-U + 00ff)%xx編碼為(兩位十六進(jìn)制),而將UTF代碼點(diǎn)U + 0100及更高版本編碼為%uxxxx(%u后跟四位十六進(jìn)制。)例如,escape("?") == "%E5"和escape("あ") == "%u3042"。
encodeURIComponent將擴(kuò)展字符百分比編碼為UTF8字節(jié)序列。例如encodeURIComponent("?") == "%C3%A5"和encodeURIComponent("あ") == "%E3%81%82"。
因此,您可以執(zhí)行以下操作:
fixedstring = decodeURIComponent(escape(utfstring));
例如,錯(cuò)誤編碼的字符“?”變成“?¥”。該命令執(zhí)行的操作escape("?¥") == "%C3%A5"是將兩個(gè)錯(cuò)誤的ISO字符編碼為單個(gè)字節(jié)。然后decodeURIComponent("%C3%A5") == "?",將兩個(gè)百分比編碼的字節(jié)解釋為UTF8序列。
如果您出于某種原因需要做相反的事情,那也可以:
utfstring = unescape(encodeURIComponent(originalstring));
有沒有辦法區(qū)分錯(cuò)誤的UTF8字符串和ISO字符串?原來有。如果給定格式錯(cuò)誤的編碼序列,則上面使用的encodeURIComponent函數(shù)將引發(fā)錯(cuò)誤。我們可以使用它來很有可能檢測(cè)我們的字符串是UTF8還是ISO。
var fixedstring;
try{
// If the string is UTF-8, this will work and not throw an error.
fixedstring=decodeURIComponent(escape(badstring));
}catch(e){
// If it isn't, an error will be thrown, and we can assume that we have an ISO string.
fixedstring=badstring;
}

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊
問題在于,一旦頁面被提供,內(nèi)容將采用內(nèi)容類型元標(biāo)記中描述的編碼?!板e(cuò)誤”編碼中的內(nèi)容已出現(xiàn)亂碼。
在提供頁面之前,最好在服務(wù)器上執(zhí)行此操作。或正如我所知道的說:UTF-8端到端或死亡。
添加回答
舉報(bào)