Servlet向客戶端發送中文數據的編碼情況
(更多內容請關注本人微信訂閱號:it_pupil)

本文講述服務端servlet向客戶端瀏覽器發送中文數據的編碼情況,需要抓住下面幾點:
輸出流發送數據,必須是以字節形式傳輸的。也就是說,如果你在服務端定義一個字符串,那么servlet要先編碼成字節數組,再發送到客戶端。
客戶端瀏覽器在收到字節碼數據時,需要將其解碼成字符串顯示出來。
在服務端,如果你使用的是字節流,那么只需要注意兩點:
拿到字符串,以特定形式編碼成字節數組(如UTF-8)。(字節數組是你人工轉換的)
告訴瀏覽器,以相同方式解碼顯示(UTF-8)。
如果你使用的是字符流,那么需要注意三點:
字符流其實就是你傳給它的是字符,它自己內部還是會轉換成字節的。
拿到字符串,告訴服務端,發送時以特定方式編碼成字節數組(如UTF-8)。(字節數組是字符流內部轉換的)
告訴瀏覽器,以相同方式解碼顯示(UTF-8)。
就上面提出的幾點,有三種實現方案保證不亂碼(也是亂碼的解決思路):
方案一,字節流:
方案二,字符流:
方案三,還是字符流:
方案三其實可以像下面模擬一下編解碼的過程(toHex方法是把字節數組以16進制形式輸出):
所以,方案三的關鍵之處在于,一開始用UTF-8編碼,最后用UTF-8解碼,這是本質。
雖然ISO-8859-1是單字節編碼,但是,一開始用UTF-8編碼后,你用ISO-8859-1解碼,它會一個字節一個字節去解開,而UTF-8表示的漢字,一個漢字是三個字節,當然會亂碼。
但是亂碼不要緊啊,這個亂碼只是個中間過程,不需要顯示出來。緊接著用ISO-8859-1再編碼,那么,編碼出的字節是跟UTF-8編碼的字節是相同的。
如此,最后再用UTF-8去解碼,完美!
本文是關于編碼分析的第5篇,原文地址:
http://mp.weixin.qq.com/s?__biz=MzIyNzUzNjQ3MA==&tempkey=37C%2F%2BA4Bi9W%2F7a0wo%2B56WiBFhphFwjbCfb6TgA3OcQ4v4JbKjTBmxOQLMoZldKoCJeAi%2BhxmRuBUwSzp7yjZCA2k5X%2BXxzpE3hD%2BaLWechfiCfr797hJOnJt29Rqr9eM5KF3ZKZOmQ%2FeJGYzG8vXRQ%3D%3D&#rd
更多內容請關注相關訂閱號查看。
浙公網安備 33010602011771號