国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

2021-01-31 17:10肖國棟的i自留地 Java教程

本篇文章主要介紹了Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼,探討了 PrintWriter 的缺省編碼與普通字符流的缺省編碼的差異,具有一定的參考價值,有興趣的可以了解一下

在前面的網頁中的編碼與亂碼系列中,曾多次提到使用 servlet 方式構建的動態響應流,不過在那里都是直接使用字節流的方式,不過,更為常見的方式是使用字符流。而在前面,又談到了 java 字節流與字符流的話題。

有了前面的基礎,現在來說下 java servlet 中使用字符流,也即是 printwriter 時的編碼與亂碼問題。

回顧字節流的情形

先回顧一下,在之前的字節流響應中,我們使用 string.getbytes 方法,然后總是顯式傳入編碼的參數,使它與 meta 中或者 header 的聲明一致。比如這樣:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

或者這樣:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

只要保持了一致,就不用擔心發生亂碼的問題。

使用 printwriter 字符流,缺省編碼

現在假如使用 printwriter 來作為響應呢?比如這樣:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

代碼中并沒有顯式傳入什么編碼的參數,不像 string.getbytes 那樣。另一方面,我們知道,字符流最終還是要轉換成字節流,可是它到底使用了什么編碼呢?是不是 charset.defaultcharset 中的值呢?

就以上述代碼為例,假如現在在瀏覽器中查看,會發現結果是這樣的:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

可見 defaultcharset 缺省是 utf-8,前面說過,這其實來自于啟動 tomcat server 時所傳入的參數 –dfile.encoding:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

但漢字卻沒有正確輸出,可見 printwriter 并沒有采用這個缺省值。查看 header 中的響應:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

也沒有任何編碼的指示。

雖然 meta 中聲明是 utf-8,輸出的缺省字符集的值也是 utf-8,可是從最終結果不難看出 printwriter 并沒有采納這個值來轉換字節流。(實際上它根本不會試圖去理解這個)。

看一看它的文檔說明,會發現情況有點不一樣:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

原來沒有指定時,printwriter 不是用 charset.defaultcharset 中的值,而是用 response.getcharacterencoding 方法中所返回的值,而沒有指定的話,那個方法其實就返回一個缺省值:iso-8859-1。

再看看 getcharacterencoding 方法:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

可以看到它的值又是來源于顯式的 response.setcharacterencoding 或 response.setcontenttype 方法,或者是隱式的 setlocale 方法。(顯式的具有更高的優先級)假如沒有,就用缺省的 iso-8859-1。

它還提到 rfc 2047 標準 ,打開看看,是關于 mime 中非 ascii 文本的消息頭擴展(mime (multipurpose internet mail extensions) part three:  message header extensions for non-ascii text)的。文中有一處提到如果字符集編碼缺失,推薦用 iso8859 系列:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

注意這里沒有明說是 iso-8859-1,它說的是 iso-8859-*,不過 servlet 最終采用的是 iso-8859-1.

所以現在清楚了,缺省用 iso-8859-1,可以用 getcharacterencoding 得到它的值,不過 iso 不支持中文字符,所以響應流中不能出現中文:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

結果是這樣:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

使用 printwriter 字符流,顯式指定編碼

按照前面說的,可以在 write 之前使用 setcharacterencoding 等方法指定編碼:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

這樣就 ok 了:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

要注意,這種情況下,response header 中仍然沒有 charset 信息,所以要在 meta 中指定。

也可以用 setcontenttype (或前面一直用的 setheader,其實兩者是等價的):

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

也能達成同樣效果:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

這種情況下,response header 中包含 charset 信息,所以前面的代碼中可以省略在 meta 中的聲明:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

那么,現在我們明白了,printwriter 的缺省與普通字符流的缺省是不同的,機制有所差別。

使用普通字符流,缺省編碼

當然如果你一定要用普通字符流,也是可以的,但最后需要主動 flush:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

這時的缺省就是 charset.defaultcharset 中的值了,這里把它拼在了 meta 和最終的輸出中,響應也是正常的:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

結果是 utf-8。跟前面所說的 tomcat server 啟動時參數的值一致。

使用普通字符流,顯式指定編碼

如果不打算用缺省,那就直接指定:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

結果同樣是 ok 的:

Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼

當然,一般還是建議使用 printwriter 來輸出,而即便你一定要用普通字符流,也最好不要用缺省。

那么關于 java servlet 中使用 printwriter 時的編碼與亂碼問題就介紹到這里。本文中的示例代碼見:servlet-printwriter.rar

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://xiaogd.net/java-servlet-使用-printwriter-時的編碼與亂碼/

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲天堂久久精品 | 亚洲在线视频 | 黄色国产大片 | 久久精品日产第一区二区三区 | 激情综合五月 | 午夜视频免费 | 黄色片视频免费 | av免费观看网站 | av网站在线免费观看 | 成人高清在线视频 | 日韩精品在线观看视频 | 久久精品国产99国产 | 欧美日韩精品一区二区三区蜜桃 | 国产高清美女一级a毛片久久 | 久久久久久免费精品 | 在线观看国产视频 | 成人免费aaa | 精品一区二区三区中文字幕 | 91仓库 | 国产精品无码久久久久 | 九色一区 | 黄色在线观看视频网站 | 中文字幕一区二区三 | 免费观看一级特黄欧美大片 | 日韩福利 | www国产精品 | 视频1区 | 久久精品国产免费 | av黄色在线免费观看 | 色嫩紧中文字幕在线 | 黄色av免费 | 一级一片在线播放在线观看 | 日韩国产在线观看 | 亚洲一区二区三区四区五区午夜 | 国产精品精品久久久 | 免费观看特级毛片 | 免费在线看黄 | www.国产视频| 亚洲精品久久 | 国产一区二区三区在线观看网站 | 久久一区|