最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年11月07日 09:32:26   作者:肖國棟的i自留地  
本篇文章主要介紹了Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼,探討了 PrintWriter 的缺省編碼與普通字符流的缺省編碼的差異,具有一定的參考價值,有興趣的可以了解一下

在前面的網(wǎng)頁中的編碼與亂碼系列中,曾多次提到使用 servlet 方式構(gòu)建的動態(tài)響應(yīng)流,不過在那里都是直接使用字節(jié)流的方式,不過,更為常見的方式是使用字符流。而在前面,又談到了 Java 字節(jié)流與字符流的話題。

有了前面的基礎(chǔ),現(xiàn)在來說下 Java servlet 中使用字符流,也即是 PrintWriter 時的編碼與亂碼問題。

回顧字節(jié)流的情形

先回顧一下,在之前的字節(jié)流響應(yīng)中,我們使用 String.getBytes 方法,然后總是顯式傳入編碼的參數(shù),使它與 meta 中或者 header 的聲明一致。比如這樣:

或者這樣:

只要保持了一致,就不用擔(dān)心發(fā)生亂碼的問題。

使用 PrintWriter 字符流,缺省編碼

現(xiàn)在假如使用 PrintWriter 來作為響應(yīng)呢?比如這樣:

代碼中并沒有顯式傳入什么編碼的參數(shù),不像 String.getBytes 那樣。另一方面,我們知道,字符流最終還是要轉(zhuǎn)換成字節(jié)流,可是它到底使用了什么編碼呢?是不是 Charset.defaultCharset 中的值呢?

就以上述代碼為例,假如現(xiàn)在在瀏覽器中查看,會發(fā)現(xiàn)結(jié)果是這樣的:

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

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

也沒有任何編碼的指示。

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

看一看它的文檔說明,會發(fā)現(xiàn)情況有點不一樣:

原來沒有指定時,PrintWriter 不是用 Charset.defaultCharset 中的值,而是用 response.getCharacterEncoding 方法中所返回的值,而沒有指定的話,那個方法其實就返回一個缺省值:ISO-8859-1。

再看看 getCharacterEncoding 方法:

可以看到它的值又是來源于顯式的 response.setCharacterEncoding 或 response.setContentType 方法,或者是隱式的 setLocale 方法。(顯式的具有更高的優(yōu)先級)假如沒有,就用缺省的 ISO-8859-1。

它還提到 RFC 2047 標準 ,打開看看,是關(guān)于 MIME 中非 ASCII 文本的消息頭擴展(MIME (Multipurpose Internet Mail Extensions) Part Three:  Message Header Extensions for Non-ASCII Text)的。文中有一處提到如果字符集編碼缺失,推薦用 iso8859 系列:

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

所以現(xiàn)在清楚了,缺省用 iso-8859-1,可以用 getCharacterEncoding 得到它的值,不過 iso 不支持中文字符,所以響應(yīng)流中不能出現(xiàn)中文:

結(jié)果是這樣:

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

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

這樣就 OK 了:

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

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

也能達成同樣效果:

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

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

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

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

這時的缺省就是 Charset.defaultCharset 中的值了,這里把它拼在了 meta 和最終的輸出中,響應(yīng)也是正常的:

結(jié)果是 utf-8。跟前面所說的 tomcat server 啟動時參數(shù)的值一致。

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

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

結(jié)果同樣是 OK 的:

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

那么關(guān)于 Java servlet 中使用 PrintWriter 時的編碼與亂碼問題就介紹到這里。本文中的示例代碼見:servlet-PrintWriter_jb51.rar

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Javaweb 500 服務(wù)器內(nèi)部錯誤的解決

    Javaweb 500 服務(wù)器內(nèi)部錯誤的解決

    這篇文章主要介紹了Javaweb 500 服務(wù)器內(nèi)部錯誤的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java 接口和抽象類的區(qū)別詳解

    Java 接口和抽象類的區(qū)別詳解

    在面向?qū)ο缶幊讨?,抽象類和接口是兩個經(jīng)常被用到的語法概念,是面向?qū)ο笏拇筇匦?,以及很多設(shè)計模式、設(shè)計思想、設(shè)計原則編程實現(xiàn)的基礎(chǔ)。本文將主要講解二者的區(qū)別
    2021-05-05
  • Java GZip 基于磁盤實現(xiàn)壓縮和解壓的方法

    Java GZip 基于磁盤實現(xiàn)壓縮和解壓的方法

    這篇文章主要介紹了Java GZip 基于磁盤實現(xiàn)壓縮和解壓,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考需要的朋友可以參考下
    2020-08-08
  • SpringCloud-Nacos服務(wù)注冊與發(fā)現(xiàn)方式

    SpringCloud-Nacos服務(wù)注冊與發(fā)現(xiàn)方式

    這篇文章主要介紹了SpringCloud-Nacos服務(wù)注冊與發(fā)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Springboot應(yīng)用中Mybatis輸出SQL日志的3種方法代碼示例

    Springboot應(yīng)用中Mybatis輸出SQL日志的3種方法代碼示例

    在前臺請求數(shù)據(jù)的時候,sql語句一直都是打印到控制臺的,有一個想法就是想讓它打印到日志里,該如何做呢?這篇文章主要給大家介紹了關(guān)于Springboot應(yīng)用中Mybatis輸出SQL日志的3種方法,需要的朋友可以參考下
    2024-01-01
  • IDEA中的clean,清除項目緩存圖文教程

    IDEA中的clean,清除項目緩存圖文教程

    這篇文章主要介紹了IDEA中的clean,清除項目緩存圖文教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • StringBuilder如何拼接(截取)想要的字符串

    StringBuilder如何拼接(截取)想要的字符串

    文章主要介紹了Java中字符串操作的兩種常用類StringBuilder和StringBuffer,以及三元表達式的使用和字符串截取的方法
    2024-12-12
  • Jmeter實現(xiàn)Base64編碼的兩種方式

    Jmeter實現(xiàn)Base64編碼的兩種方式

    這篇文章主要介紹了Jmeter實現(xiàn)Base64編碼,大家都知道Jmeter實現(xiàn)Base64編碼有兩種方式,本文通過圖文并茂的形式把每種方法給大家介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • Spring Boot整合FTPClient線程池的實現(xiàn)示例

    Spring Boot整合FTPClient線程池的實現(xiàn)示例

    這篇文章主要介紹了Spring Boot整合FTPClient線程池的實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • 詳解Java中ThreadLocal類型及簡單用法

    詳解Java中ThreadLocal類型及簡單用法

    ThreadLocal實例通常是希望將狀態(tài)與線程關(guān)聯(lián)起來的類中的私有靜態(tài)字段,下面通過例子給大家詳細介紹Java中ThreadLocal類型及簡單用法,感興趣的朋友跟隨小編一起看看吧
    2021-10-10

最新評論

囊谦县| 普宁市| 高州市| 瑞丽市| 昔阳县| 乌审旗| 凉城县| 景谷| 洛川县| 达拉特旗| 玉林市| 若羌县| 通江县| 吴江市| 行唐县| 元谋县| 永泰县| 哈密市| 来凤县| 正阳县| 塘沽区| 南漳县| 开鲁县| 博白县| 东宁县| 龙州县| 深泽县| 光泽县| 麻栗坡县| 上栗县| 渭南市| 北海市| 新丰县| 杨浦区| 黔江区| 时尚| 景德镇市| 汉源县| 乳源| 怀集县| 昭通市|