?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

澳門新莆京app官網:淺析Servlet和Jsp中的多國語言顯示

?

由于不停不信Java竟會有不能混排顯示多國說話的BUG,這個周末鉆研了澳門新莆京app官網一下Servlet、Jsp的多國說話 顯示的問題,也便是Servlet的多字符集問題,因為我對字符集的觀點還不是很清晰以是寫出的器械未必 是準確的,我是這樣理解Java中的字符集的:在運行時,每個字符串工具中存儲的都是編碼為UNICODE內 碼的(筆者覺得所有的說話中都是有響應編碼的,由于在謀略機內部字符串老是用內碼來表示的,只不過 一樣平常謀略機說話中的字符串編碼時平臺相關的,而Java則采納了平臺無關的UNICODE)。

Java從一個byte流中讀取一個字符串時,將把平臺相關的byte轉變為平臺無關的Unicode字符串。在輸 出時Java將把Unicode字符串轉變為平臺相關的byte流,假如某個Unicode字符在某個平臺上不存在,將會 輸出一個´?´。舉個例子:在中文Windows中,Java讀出一個"GB2312"編碼的文件 (可所以任何流)到內存中構造字符串工具,將會把GB2312編碼的翰墨轉變為Unicode編碼的字符串,如 果把這個字符串輸出又將會把Unicode字符串轉化為GB2312的byte流或數組:"中文測試"---- ->"u4e2du6587u6d4bu8bd5"----->"中文測試"。

byte[] bytes = new byte[]{(byte)0xd6, (byte)0xd0, (byte)0xce,

(byte)0xc4, (byte)0xb2, (byte)0xe2, (byte)0xca, (byte)0xd4};//GBK編碼的"中文測試 "

java.io.ByteArrayInputStream bin = new java.io.ByteArrayInputStream(bytes);

java.io.BufferedReader reader =new java.io.BufferedReader(new java.io. InputStreamReader澳門新莆京app官網 (bin,"GBK"));

String msg = reader.readLine();

System.out.println(msg)

這段法度榜樣放到包孕"中文測試"這四個字的系統(如中體裁系)中,可以精確地打印出這些 字。msg字符串中包孕了精確的"中文測試"的Unicode編碼: "u4e2du6587u6d4bu8b澳門新莆京app官網d5",打印時轉換為操作系統的默認字符集,是否可以精確顯示依附于操 作系統的字符集,只有在支持響應字符集的系統中,我們的信息才能精確的輸出,否則獲得的將會是垃圾 。

話入正題,我們來看看Servlet/Jsp中的多說話問題。我們的目標是,任一國家的客戶端經由過程Form向 Server發送信息,Server把信息存入數據庫中,客戶端在檢索時仍舊能夠看到自己發送的精確信息。事實 上,我們要包管,終極Server中的SQL語句中保存的時包孕客戶端發送翰墨的精確Unicode編碼;DBC與數 據庫通訊時采納的編碼要領能包孕客戶端發送的翰墨信息,事實上,最好讓JDBC直接應用UNICODE/UTF8與 數據庫通訊!這樣就可以確保不會損掉信息;Server向客戶端發送的信息時也要采納不損掉信息的編碼方 式,也可所以Un澳門新莆京app官網icode/Utf8。

假如不指定Form的Enctype屬性,Form將把輸入的內容依照當前頁面的編碼字符集urlencode之后再提 交,辦事器端獲得是urlencoding的字符串。編碼后獲得的urlencoding字符串是與頁面的編碼相關的,如 gb2312編碼的頁面提交"中文測試",獲得的是"%D6%D0%CE%C4%B2%E2%CA%D4",每個 "%"后跟的是16進制的字符串;而在UTF8編碼時獲得的卻是"%E4%B8%AD%E6%96%87%E6% B5%8B%E8%AF%95",由于GB2312編碼中一個漢字是16位的,而UTF8中一個漢字卻是24位的。中日韓三 國的ie4以上瀏覽器均支持UTF8編碼,這種規劃肯定體貼了這三國說話,以是我們假如讓Html頁面應用 UTF8編碼那么將至少可以支持這三國說話。

然則,假如我們html/Jsp頁面應用UTF8編碼,由于利用法度榜樣辦事器可能不知道這種環境,由于假如瀏 覽器發送的信息不包孕charset信息,至多Server知道讀到Accept-Language哀求投標,我們知道僅靠這個 投標是不能獲知瀏覽器所采納編碼的,以是利用法度榜樣辦事器不能精確解析提交的內容,為什么?由于Java 中的所有字符串都是Unicode16位編碼的,HttpServletRequest.request(String)的功能便是把客戶端提 交的Urlencode編碼的信息轉為Unicode字澳門新莆京app官網符串,有些Server只能覺得客戶真個編碼和Server平臺相同,簡 單地應用URLDecoder.decode(String)措施直接解碼,假如客戶端編碼正好和Server相同,那么就可以得 到精確地字符串,否則,假如提交地字符串中包孕了當地字符,那么將會導致垃圾信息。

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

快三平台开户