關(guān)于使用utf8編碼實(shí)現(xiàn)全球化的幾點(diǎn)困惑
Posted on 2006-04-09 10:25 publisher luo 閱讀(3820) 評(píng)論(1) 編輯 收藏 所屬分類: java技術(shù)??? 某日一時(shí)興起將我們的內(nèi)容管理發(fā)布系統(tǒng)改成uft-8格式(即將所有頁面encode變?yōu)閡tf8,mysql字符集也變成uft-8)來支持能夠建立各種語言的網(wǎng)站(產(chǎn)品現(xiàn)在可以免費(fèi)下載,網(wǎng)址為:http://sourceforge.net/projects/nodepublisher)。但是在修改程序過程中發(fā)現(xiàn)了一個(gè)問題,那就是在客戶端頁面提交過來的請(qǐng)求的編碼格式在服務(wù)器端無法獲知。如果提交頁面的<head>里面如果包含<meta http-equiv="Content-Type" content="text/html; charset=utf-8">,漢字部分則以u(píng)tf8編碼提交,如果沒有的話則以gbk編碼提交,而服務(wù)器端接受到的request無法判別編碼格式,取到的頭信息只有一些zh類似的說明,所以無法正確的將其轉(zhuǎn)換成正確的編碼格式。
另一需要注意的是不能將取到的參數(shù)從ISO8859轉(zhuǎn)換成中文系統(tǒng)默認(rèn)的字符集GBK,然后再轉(zhuǎn)換成utf8,這樣的話如果出現(xiàn)奇數(shù)漢字的話會(huì)導(dǎo)致部分漢字亂碼,原因在于漢字在GBK編碼中為2個(gè)byte,而在utf8編碼則為3個(gè)byte,如果是偶數(shù)個(gè)漢字,從ISO8859(tomcat默認(rèn)得到的request都是ISO8859編碼)轉(zhuǎn)換成GBK,然后再轉(zhuǎn)換成ISO8859到還無妨,但是奇數(shù)個(gè),最后一個(gè)byte不知道會(huì)怎么轉(zhuǎn)換成GBK的,然后再轉(zhuǎn)回到utf8時(shí)最后那個(gè)字符就會(huì)成為亂碼,我想可能是跟String類里面的拆分char的方法有關(guān),不知道誰有更加明確的分析和解釋。
再一數(shù)據(jù)庫方面使用mysql5,設(shè)置成utf8初始化數(shù)據(jù)腳本漢字轉(zhuǎn)換成uft8,一切正常。后來無意將數(shù)據(jù)庫轉(zhuǎn)換成GBK編碼,竟然程序運(yùn)行也正常,后來經(jīng)過測(cè)試將mysql設(shè)置成gbk,然后執(zhí)行初始化sql腳本,漢字編碼格式為GBK,程序運(yùn)行依然正常。不明白其中的原由。