1. 程式人生 > >PHP 中 json_encode中文處理、urlencode方法、post中文亂碼

PHP 中 json_encode中文處理、urlencode方法、post中文亂碼

  今天在用HttpClient的PostMethod模擬瀏覽器用表單的post方法傳送資料給伺服器的時候,如果資料是中文,伺服器接收的是亂碼,然後看了很多亂碼的文章,最後解決了,現在總結下.
  1.首先搞清楚客戶端是用那種編碼方式將資料編碼後提交的.
瀏覽器在form提交後,會生成一個HTTP的頭部資訊"content-type",標準規定其形式為Content-type: application/x-www-form-urlencoded; charset=UTF-8
這樣伺服器端就可以知道form裡的字元是怎麼編碼的了。要注意的是這裡的charset=UTF-8是預設的,如果這個HTML程式碼裡有<meta http-equiv="Content-Type" content="text/html; charset=GBK" />,那麼此HTML的form表單將以GBK的編碼方式提交資料,其實表單提交資料使用的編碼方式是可以指定的.
那現在用HttpClient,根本就沒有瀏覽器和具體的HTML程式碼,其實HttpClient的PostMethod物件裡已經有設定編碼方式的方法
Java程式碼  收藏程式碼
  1. PostMethod post = new PostMethod("http://iteye.com");  
  2. post.setRequestHeader("ContentType","application/x-www-form-urlencoded;charset=UTF-8");  
這裡的編碼方式可以隨意指定,開始就是因為沒有寫這段,採用了Httpclient預設的編碼方式,所以出現亂碼,這裡設定編碼方式的方法也不唯一.ajax使用post方法提交資料的編碼方式的設定也和這個類似.

  2.伺服器端是如何選擇那種編碼方式來對資料進行解碼的呢.
首先我用request.getCharacterEncoding()來看錶單提交資料所使用的編碼方法,奇怪的是用瀏覽器提交request.getCharacterEncoding()是null,而用HttpClient提交request.getCharacterEncoding()的值是UTF-8,和客戶端指定的編碼方式一致,後來google了下,原來是瀏覽器做的手腳,IE是不將表單提交資料使用的編碼方式寫到HTTP頭部發送出去的.我發現如果用HttpClient的post提交資料,編碼方式指定的話,request.getCharacterEncoding()是能得到值的,而且request物件也用此編碼方式解碼,不用request.setCharacterEncoding("")指定;如果request.getCharacterEncoding()是null,就要request.setCharacterEncoding("")指定編碼方式,要和你提交時設定的編碼方式一致.然後request.getParameter("")的值就是你想要的了.(這裡有可能有誤的地方請指出)