URL只能使用英文字母、阿拉伯數字和某些標點符號,不能使用其他文字和符號。這是因爲網絡標準RFC1738做了硬性規定:
一、HTML頁面(response亂碼)
- 網頁中html的編碼:HTTP header 、meta、user-agent(瀏覽器) 權重越來越低,也就是說http頭會覆蓋meta頭信息。
- 可以在後臺設置編碼方式:response.setContentType(“text/html; charset=utf-8”);
- 可以在前端設置編碼方式:
HTML5簡化成
css文件頂部:@charset utf-8 - 若前兩者均沒有,瀏覽器一般有默認編碼。
Content-Type:是Http的實體首部字段,用於說明請求或返回的消息主體是用何種方式編碼,在request header和response header裏都存在。
瀏覽器解碼html字節流過程:當瀏覽器請求一個靜態html時,服務器會將html頁面的字節流通過網絡傳輸給瀏覽器。瀏覽器再將字節流解碼成相應的html文本字符,從而將html元素渲染出來。
-
查看頁面編碼方式(也就是瀏覽器查看應該用什麼方式解碼)如下圖:
-
一個html頁面可以有多種編碼:
與html頁面編碼相關的還有js(css)文件編碼,默認是採用html的編碼格式去解析js(css)文件。如果js(css)文件與html頁面編碼方式不同,則script標籤有一個charset屬性來指定編碼方式。
script type=“text/javascript” src=“myscripts.js” charset=“UTF-8”/
二、Web後臺編碼(request亂碼)
html頁面是utf-8格式的, 頁面編碼也指定爲utf-8。
- POST
html提交普通表單時,參數以字節流的方式傳輸到web服務器,web服務器解碼字節流得到參數。tomcat默認採用ISO-8859-1編解碼,所以直接獲取參數是亂碼,以ISO-8859-1編碼回原本的字節流再用utf-8重新解碼就可以得到正確的參數。
可以在獲取任何參數前調用 request.setCharacterEncoding(“utf-8”) ,即可用utf-8解碼參數,就不用那麼麻煩了。其他語言在原理上也都是相同的。 - GET方式原理一樣,代碼比較麻煩,一般在Tomcat中配置
connectionTimeout=“20000”
redirectPort=“8443”
URIEncoding=“UTF-8”
三、哪些字符需要轉碼
- ASCII的控制字符
ASCII表上的數字0–31分配給了控制字符,用於控制像打印機等一些外圍設備。例如,12代表換頁/新頁功能,指示打印機跳到下一頁的開頭。這些字符是不可打印的,自然需要轉化。 - 一些非ASCII字符
比如中文,阿拉伯字符等。 - 一些保留字符
比如最常見的連接符“&”。(&是看成普通字符還是參數分隔符) - 一些不安全的字符
比如空格,爲了防止引起歧義,需要轉化成“+”。