很多開(kāi)源軟件都有國(guó)際化和本地化的問(wèn)題,其實(shí)國(guó)際化本沒(méi)有那么復(fù)雜,只是總有些公司希望通過(guò)拒絕國(guó)際標(biāo)準(zhǔn)來(lái)提高市場(chǎng)占有率,所以也就漸漸導(dǎo)致了現(xiàn)在的情況。很多開(kāi)源軟件首要支持的便是UTF編碼,然后才是其他編碼。(by gashero)當(dāng)然也有些不著調(diào)的軟件首選的是ISO-8859-1編碼,甚至是ASCII編碼。好了,下面先講講編碼,因?yàn)門omcat也是一種不著調(diào)的軟件。
常見(jiàn)的中文編碼有GB2312、GBK、GB18030等等,當(dāng)然沒(méi)有包括繁體中文,這些編碼都是表示編碼,而并非是顯示編碼。現(xiàn)在越來(lái)越多的軟件,在其核心使用的顯示編碼或者說(shuō)處理編碼,是Unicode編碼。Unicode編碼使用2字節(jié)表示了世界上幾乎所有的文字符號(hào),作軟件的內(nèi)部國(guó)際化處理再適合不過(guò)了。
只是有些齷齪公司,為了商業(yè)目的,對(duì)內(nèi)核的Unicode編碼API全部屏蔽,對(duì)外只提供本地化編碼。(by gashero)比如M$公司在中文軟件上就主推GBK編碼。
還有一個(gè)問(wèn)題就是用C/C++編寫的很老的軟件,字符串結(jié)束標(biāo)志是'\0',而使用Unicode的話,會(huì)無(wú)故的截?cái)嘁恍┳址K訳TF-8就應(yīng)運(yùn)而生了,這種變長(zhǎng)編碼既可以減小字符串的體積,也可以防止階段而傳輸U(kuò)nicode編碼。
至于傳統(tǒng)的英文編碼,最常見(jiàn)的就是兩種。一是ASCII,這種字符集高位為0,用7位表示數(shù)據(jù)。另一種是ISO-8859-1,每個(gè)字符1字節(jié),用8位表示一個(gè)字符。
Tomcat的內(nèi)置編碼就是使用了ISO-8859-1。這也是本文最關(guān)鍵的一句,各種技巧的根本。
由此可知由網(wǎng)頁(yè)所提交的數(shù)據(jù)就需要從ISO-8859-1解碼,如下是獲得提交參數(shù)number的例子。
String number=new String(request.getParameter("number").getBytes("ISO-8859-1"),"UTF-8");
這句就成功的實(shí)現(xiàn)了從ISO-8859-1向UTF-8編碼的轉(zhuǎn)換。
有經(jīng)驗(yàn)的讀者應(yīng)該遇到過(guò)通過(guò)<jsp:param>標(biāo)簽傳遞網(wǎng)頁(yè)間參數(shù)時(shí)出錯(cuò)的問(wèn)題。(by gashero)接收到的字符串只要是無(wú)論如何都是一堆問(wèn)號(hào)。其實(shí)這也是Tomcat內(nèi)部編碼所導(dǎo)致的。如果可以順應(yīng)Tomcat的內(nèi)部編碼就可以傳遞中文字符串了。
比如一個(gè)頁(yè)面間的內(nèi)部重定向:
<jsp:forward page="index.jsp">
<jsp:param name="name" value="<%=new String("中文參數(shù)".getBytes("UTF-8"),"ISO-8859-1") %>" />
</jsp:forward>
而在目的頁(yè)面接收參數(shù)的時(shí)候也需要再次從ISO-8859-1編碼轉(zhuǎn)換到UTF-8編碼。這樣就實(shí)現(xiàn)了在頁(yè)面之間傳遞中文參數(shù)。
常見(jiàn)的中文編碼有GB2312、GBK、GB18030等等,當(dāng)然沒(méi)有包括繁體中文,這些編碼都是表示編碼,而并非是顯示編碼。現(xiàn)在越來(lái)越多的軟件,在其核心使用的顯示編碼或者說(shuō)處理編碼,是Unicode編碼。Unicode編碼使用2字節(jié)表示了世界上幾乎所有的文字符號(hào),作軟件的內(nèi)部國(guó)際化處理再適合不過(guò)了。
只是有些齷齪公司,為了商業(yè)目的,對(duì)內(nèi)核的Unicode編碼API全部屏蔽,對(duì)外只提供本地化編碼。(by gashero)比如M$公司在中文軟件上就主推GBK編碼。
還有一個(gè)問(wèn)題就是用C/C++編寫的很老的軟件,字符串結(jié)束標(biāo)志是'\0',而使用Unicode的話,會(huì)無(wú)故的截?cái)嘁恍┳址K訳TF-8就應(yīng)運(yùn)而生了,這種變長(zhǎng)編碼既可以減小字符串的體積,也可以防止階段而傳輸U(kuò)nicode編碼。
至于傳統(tǒng)的英文編碼,最常見(jiàn)的就是兩種。一是ASCII,這種字符集高位為0,用7位表示數(shù)據(jù)。另一種是ISO-8859-1,每個(gè)字符1字節(jié),用8位表示一個(gè)字符。
Tomcat的內(nèi)置編碼就是使用了ISO-8859-1。這也是本文最關(guān)鍵的一句,各種技巧的根本。
由此可知由網(wǎng)頁(yè)所提交的數(shù)據(jù)就需要從ISO-8859-1解碼,如下是獲得提交參數(shù)number的例子。
String number=new String(request.getParameter("number").getBytes("ISO-8859-1"),"UTF-8");
這句就成功的實(shí)現(xiàn)了從ISO-8859-1向UTF-8編碼的轉(zhuǎn)換。
有經(jīng)驗(yàn)的讀者應(yīng)該遇到過(guò)通過(guò)<jsp:param>標(biāo)簽傳遞網(wǎng)頁(yè)間參數(shù)時(shí)出錯(cuò)的問(wèn)題。(by gashero)接收到的字符串只要是無(wú)論如何都是一堆問(wèn)號(hào)。其實(shí)這也是Tomcat內(nèi)部編碼所導(dǎo)致的。如果可以順應(yīng)Tomcat的內(nèi)部編碼就可以傳遞中文字符串了。
比如一個(gè)頁(yè)面間的內(nèi)部重定向:
<jsp:forward page="index.jsp">
<jsp:param name="name" value="<%=new String("中文參數(shù)".getBytes("UTF-8"),"ISO-8859-1") %>" />
</jsp:forward>
而在目的頁(yè)面接收參數(shù)的時(shí)候也需要再次從ISO-8859-1編碼轉(zhuǎn)換到UTF-8編碼。這樣就實(shí)現(xiàn)了在頁(yè)面之間傳遞中文參數(shù)。