<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    悟心

    成功不是將來才有的,而是從決定去做的那一刻起,持續累積而成。 上人生的旅途罷。前途很遠,也很暗。然而不要怕。不怕的人的面前才有路。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      93 隨筆 :: 1 文章 :: 103 評論 :: 0 Trackbacks
    服務器返回亂碼頁面,請求的數據發送到服務器后取出來是亂碼,以上兩個問題是web開發人員經常遇到的問題,解決這類問題需要理解亂碼問題的根源所在。

    1. 字符編碼
    字符是以二進制編碼的形式保存在存儲器中的,如:“我”這個字,可以用gbk的方式保存(用字節表示是[-50, -46]),也可以用utf-8的方式保存(用字節表示是[-26, -120, -111])。程序在讀取數據塊時需要一個字節一個字節的讀取,然后將字節轉換為字符,顯然如果程序不知道字節是表示的什么編碼的字符,讀出來就會出問題,這就如同你說了一句話,我如果事先不知道你說的將是什么語言,就沒法去翻譯了,如果你說的英語,我以為是日語,然后按日語的方式來理解到我的主觀意識,顯然結果就是不知你在說什么了,就成了我們程序中的亂碼。所以對于前面我所表示的字節數組byte[] data = {-26, -120, -111},我們必須這樣做才能得到正確的字符: String s = new String(data, "utf-8"),(注:這里用了字符串,因為字符串就是由一個個字符組成的),如果我們不指定參數里面的"utf-8",那么系統就會用操作系統默認的編碼了,這可能是gbk或是什么任何編碼。

    2. jsp服務器返回亂碼頁面
      2.1 pageEncoding
      在jsp頁面的page指令中我們指定了pageEncoding屬性,這個屬性就是告訴jsp容器如何讀取這個jsp頁面,所以這個屬性必須與jsp頁面保存的編碼保持一致。也就是說,如果你頁面的編碼保存為gbk, 而pageEncoding設置成了utf-8,則jsp容器在讀這個jsp頁面的時候就會出錯(如果存在非英文字符的話)。jsp容器讀jsp的目的是將其翻譯成java代碼,所以如果讀錯了jsp頁面,翻譯出來的java代碼也就會出錯,如果這種錯誤影響了java文件的語法,就會在訪問時出現無法編譯jsp的語法錯誤,如果沒有影響到語法,就會出現最終顯示的html頁面上有亂碼的錯誤。所以如果遇到顯示亂碼,則檢查pageEncoding是否正確。
      2.2 contentType
      page指令中的contentType屬性用于指定返回給瀏覽器的數據的文檔類型,服務器通過http頭信息返回給瀏覽器這個信息,所以在瀏覽器 html代碼中用戶是看不到的。同時contentType屬性還可以指定頁面的編碼,即服務器即以什么編碼發送頁面數據。比如說中文數據,可以用gbk 或utf-8的方式來發送,這個編碼跟jsp頁面的編碼沒有關系,只要設定的編碼支持頁面中的字符就行了。相同于有了一個字符串s="中國人",然后用 s.getBytes("gbk")的方式來發送s。所以由于contentType錯誤出現亂碼的概念不高,但也要注意一下,比如說如果設置成了"iso8859-1",則瀏覽器就會顯示亂碼了。contentType還有一個用,就是瀏覽器將會依據這個編碼來顯示頁面,在IE下點右鍵,然后選擇“編碼”,你就可以注意到頁面是以什么編碼顯示的了。
      2.3 如果是servlet返回的結果
      上面說的是jsp,如果servlet的話就要注意設置response.setCharacterEncoding(""),如果沒有設置,服務器會默認為是iso8859-1,設置后得到的writer(即response.getWriter())對象,就會依據這個編碼來向客戶端寫數據,writer對象的構造與以下方式類似:PrintWriter pw = new PrinterWriter(new OutputStreamWriter(socket.getOutputStream(), "編碼")),這里提到了通過socket得到輸出流,不明白的話可以參考我的另一篇文章。pw.write("你好"),實際上就是先通過byte[] data = "你好".getBytes("編碼"),然后將data寫給客戶端。
    )

    3. 服務器得到客戶端傳過來的數據為亂碼
      3.1 通用解決方案
      String param = request.getParameter("paramName"),如果瀏覽器傳過來的為中文,則取出來的數據將是亂碼。為什么呢?因為客戶端只能將數據的編碼傳給服務器,如[-26, -120, -111],但服務器并不知道這是什么字符集的編碼,于是假定為iso8859-1, 用這種方式構造了字符串s = new String(data, "iso8859-1"),顯然這樣肯定是亂碼。解決方案很簡單,我們得到值param后,用byte data[] = param.getBytes("iso8859-1"),這樣data就是客戶端傳過來的真實編碼,然后我們再重新創建字符串:param = new String(data, "正確的編碼");
      3.2 POST請求
      如于post請求處理起來更簡單,get請求與post請求向服務器發送數據的方式不一樣,get請求的參數是通過HTTP頭信息中的第一行數據發送的,是URI的一部分,而post請求則是在發送完HTTP頭信息后作為單獨的數據塊發送的。因此對于get請求的參數,我們在使用request之前服務器已經讀出來了,已經是亂碼了,只能用前面的方案,但對于post請求的數據,我們在調用getParameter或getReader之前,服務器并沒有去處理,所以我們可以在getParameter之前先告訴服務器正確的編碼,通過request.setCharacterEncoding("正確的編碼"),然后再讀取參數。

    4 AJax
      對于ajax請求注意要用utf-8編碼,request和response都需要使用utf-8
    posted on 2010-01-20 13:02 艾波 閱讀(375) 評論(0)  編輯  收藏 所屬分類: BUG
    主站蜘蛛池模板: 蜜芽亚洲av无码一区二区三区| 亚洲精品第一国产综合精品| 国产精品久久久久久亚洲小说| 最近最新中文字幕完整版免费高清 | 亚洲日韩精品射精日| 搜日本一区二区三区免费高清视频 | 一级女人18毛片免费| 亚洲另类视频在线观看| 可以免费看黄视频的网站| 国产亚洲sss在线播放| 成人毛片免费视频| 国产亚洲人成在线影院| 亚洲无码精品浪潮| 高清一区二区三区免费视频| 亚洲大片免费观看| 日本一道综合久久aⅴ免费| 无码日韩人妻AV一区免费l| 久久久精品国产亚洲成人满18免费网站 | 亚洲免费闲人蜜桃| 日韩视频在线免费观看| 乱人伦中文视频在线观看免费| 国产自偷亚洲精品页65页| 免费在线看黄的网站| 亚洲伦理一二三四| 亚洲国产91精品无码专区| 国产在线精品一区免费香蕉| 亚洲色成人网一二三区| 日韩在线免费电影| A国产一区二区免费入口| 亚洲天堂一区在线| 亚洲AV无码不卡在线观看下载| 国产免费一区二区三区在线观看| 亚洲成人免费网站| 亚洲成a人一区二区三区| 一区二区免费视频| 爱情岛亚洲论坛在线观看 | 国产色爽免费无码视频| 亚洲AV无码乱码在线观看代蜜桃 | 国产免费黄色大片| 日韩内射激情视频在线播放免费| 亚洲国产精品美女久久久久|