ServletOutputStream回寫頁面亂碼

2021-07-02 01:06:43 字數 1719 閱讀 9338

一段utf-16的string,整了好多種格式,硬是無法正確輸出到頁面上:

首先嘗試了outputstream, 即便指定string-》byte的編碼,還是出錯

resp.getoutputstream().write(out.getbytes("utf-16"));

resp.getoutputstream().print(out);

resp.getoutputstream().flush();

resp.getwriter().close();

然後嘗試過printwriter,均以失敗告終。

藉此也搞明白了response回寫內容的兩個方法:(指上面的writer和outstream)

1.printwriterobject that can send character text to the client.

2.servletoutputstream suitable for writing binary data in the response

3.callingflush()on the ***  commits the response.

4.eithergetoutputstream()orgetwriter()may be called to write the body,not both.

但是比較詭異的是,為什麼這兩種方式(指上面的writer和outstream)會出現亂碼呢?

再看看編碼解析的過程:

uses the character encoding returned bygetcharacterencoding().

首先使用response物件的getcharacterencoding()

,如果沒有設定,則預設編碼方式都為iso-8859-1

那麼問題也就明確了,在輸入流指定正確的編碼之後,還需要配合response的編碼引數,否則讀出來解析就亂碼

正解

//方式1

resp.setcharacterencoding("utf-16");

resp.getwriter().print(out);

resp.getwriter().flush();

resp.getoutputstream().close();

//方式2

resp.setcharacterencoding("utf-16");

resp.getoutputstream().write(out.getbytes("utf-16"));

resp.getoutputstream().flush();

resp.getoutputstream().close();

再或者,包裝一層: 

servletoutputstream out2 = resp.getoutputstream(); 

outputstreamwriter ow = new outputstreamwriter(out2,"utf-16");

ow.write(out);

ow.flush();

ow.close();

Linux dirty page回寫時機

1 定時方式 定時回寫是基於這樣的原則 proc sys vm dirty writeback centisecs的值表示多長時間會啟動回寫執行緒,由這個定時器啟動的回寫執行緒只回寫在記憶體中為dirty時間超過 proc sys vm didirty expire centisecs 100 秒的...

mybatis 主鍵回寫

在一張資料表中如果設定了第乙個屬性主鍵自增長,使用mybatis 新增資料成功後需要獲取主鍵,則可以通過主鍵回寫來獲取主鍵 方式一 userdao.xml中的sql新增語句 insert into t clazz classname,classloc values 方式二 使用mysql自帶的 la...

頁面回發和事件回傳

客戶端 瀏覽器 客戶端事件 傳送資料 資料 服務端 引發伺服器端事件處理程式 處理資料 處理完畢,重新形成 html 傳送 html 客戶端 瀏覽器 展示 頁面回發包含了 頁面第一次傳送到客戶端引起的 not ispostback 和客戶端事件 事件回傳 引起的頁面回發 上面的圖就是頁面回發的示意圖...