java中常見的中文亂碼總結(jié)
1.IO流中讀取文件時出現(xiàn)亂碼問題
1,先記錄從文件中(new File()的時候)讀取數(shù)據(jù)逐級包裝直至緩沖字節(jié)輸入流(new BufferReader())并設(shè)置編碼格式
//文件路徑 String path = "??????????????????"; //讀取文件 File file = new File(path); //包裝成文件字節(jié)輸入流 FileInputStream fis = new FileInputStream(file); //下邊這個流可以理解為從字節(jié)流邁向字符流的一個橋梁 //并且InputStreamReader在創(chuàng)建對象的時候可以傳入想要的字符編碼的參 //數(shù)這里是“utf-8” InputStreamReader isr = new InputStreamReader(fis,"utf-8"); //再將InputStreamReader包裝進(jìn)BufferReader中 BufferedReader br = new BufferedReader(isr);
2.字節(jié)碼文件讀取時出現(xiàn)的亂碼問題
遇到了一個在eclipse使用過程中發(fā)生的轉(zhuǎn)碼問題 ,安裝完eclipse后Project→Properties→Resource中寫著默認(rèn)的編碼格式為GBK,我一直沒有改成UTF-8,在學(xué)習(xí)過程中因為一直統(tǒng)一使用GBK編碼 所以一直也沒有出現(xiàn)問題

直到有一天我在湯姆貓上運(yùn)行我學(xué)習(xí)Servlet中寫的代碼時發(fā)現(xiàn)一個有趣的現(xiàn)象
如果我使用response直接向服務(wù)器發(fā)送中文內(nèi)容不會出現(xiàn)亂碼
`resp.getWriter().println("<h1>我喜歡吃</h1>");
但是在使用BufferReader的readline()方法讀取到中文內(nèi)容時會出現(xiàn)亂碼情況,我試過無論我修改IO流中讀取字符的編碼格式 還是修改整個項目的編碼格式 都不能改變這個亂碼問題
BufferedReader br = new BufferedReader(fr); br.readLine()//下圖中“tom!”的那一行

請教了老師,得到了新的解決辦法
在本類中加入一行代碼,這句代碼的意思是查看VM啟動參數(shù),運(yùn)行后在控制臺上就可以看到下圖中的信息(只截了部分片段)可以看到有一個屬性叫file.encoding它的值是GBK
意思我個人分析可能是我創(chuàng)建項目的時候使用的是GBK編碼 然后自己也運(yùn)行過這個項目 .class的字節(jié)碼文件已經(jīng)生成了 這時候如果只在項目右鍵Properties進(jìn)去修改編碼格式為時已晚
//查看VM啟動參數(shù) System.getProperties().list(System.out);

老師給出了一個臨時解決辦法,在本類中將要出現(xiàn)亂碼的那一行之前加上一行
System.setProperty("file.encoding", "utf-8");將上文中提到的VM參數(shù)中file.encoding的值現(xiàn)改成utf-8
其實最根本的解決辦法就是在項目創(chuàng)建之初就設(shè)定好編碼格式,如果出現(xiàn)像我這樣來不及的情況的話可以臨時使用這個方法
3.使用Servlet過濾器Filter統(tǒng)一設(shè)置整個Servlet項目中的各種編碼格式
Servlet提供了三大組件 servlet filer listener
在設(shè)置編碼格式時 我們就可以預(yù)先設(shè)定一個全局范圍內(nèi)的過濾器,
創(chuàng)建Filter類 添加注解@WebFilter(eclipse在創(chuàng)建Filter類時會自動創(chuàng)建該注解) 注解的內(nèi)容我這里直接寫了/* ,表示本項目中所有請求都必須先經(jīng)過這個Filter過濾
@WebFilter("/*")
public class EncodingFilter implements Filter {
public EncodingFilter() {
}
@Override
public void init(FilterConfig fConfig) throws ServletException {
//當(dāng)Filter被初始化的時候調(diào)用,打印輸出
//Servlet默認(rèn)是懶加載模式
System.out.println("encodingfilter is initialized........");
}
@Override
public void destroy() {
//當(dāng)filter被銷毀的時候調(diào)用,打印輸出
System.out.println("encodingfilter is destoryed.......");
}
//doFilter方法就相當(dāng)于一個篩子
//一共四行代碼 分別是我們提出的三個要求,和一條放行代碼
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//設(shè)置解析報文的編碼格式
request.setCharacterEncoding("utf-8");
//設(shè)置返回響應(yīng)使用的編碼格式
response.setCharacterEncoding("utf-8");
//告訴瀏覽器響應(yīng)內(nèi)容是text和html類型的文件 編碼格式是utf-8
response.setContentType("text/html;charset=utf-8");
//放行請求
//其中包含了請求從哪里來 準(zhǔn)備到哪里去的相關(guān)信息
chain.doFilter(request, response);
}
}
過濾器的功能除了簡介的注解形式之外,Servlet中還有一種基于web.xml文件的形式,打開web.xml文件,在根目錄下加入以下代碼
<filter> <!-- 標(biāo)簽的name --> <filter-name>encode</filter-name> <!-- 標(biāo)簽的類的位置 --> <filter-class>com.zyj.day02.EncodingFilter</filter-class> </filter> <filter-mapping> <!-- 對應(yīng)得標(biāo)簽的name --> <filter-name>encode</filter-name> <!-- 聲明作用域的范圍 --> <url-pattern>/*</url-pattern> </filter-mapping>
雖然內(nèi)容比較簡單 但寫起來也算是比較繁瑣 所以建議還是使用注解的形式來實現(xiàn)功能
值得一提的是
通過在filter類的init方法中添加了一句打印語句我們發(fā)現(xiàn),如果你既在類名上標(biāo)明注解 又在web.xml文件中添加了配置,那么當(dāng)有請求過來的時候,我們會在控制臺上發(fā)現(xiàn)init方法執(zhí)行了兩次,雖然目前看來沒有什么問題 但總的來說 二者有一個即可。
4,從阿里云服務(wù)器上的mysql數(shù)據(jù)庫中讀取數(shù)據(jù)產(chǎn)生的中文亂碼
問題描述:
當(dāng)我在servlet中連接好數(shù)據(jù)庫 打算實現(xiàn)一個寫入的功能 一個讀取的功能
本來是可以通過sql語句順利的寫入中文,在數(shù)據(jù)庫中查詢到中文,還可以讀取數(shù)據(jù)打印在控制臺上 整個過程中都沒有出現(xiàn)亂碼問題 但當(dāng)我想使用直接從數(shù)據(jù)庫中讀取中文 “小張” 作為我項目中登錄功能的賬號時 發(fā)現(xiàn)無法讀取到正確的數(shù)據(jù) 以至于判定我在賬號框輸入的“小張”不存在 正在初學(xué)階段 大體知道各個流程中的各個編碼環(huán)境 但還是沒有找到是哪個環(huán)節(jié)的編碼格式與眾不同
找到了一個解決辦法 :
在項目中druid-config.properties(阿里云德魯伊的配置文件)中的url屬性后拼接一個?characterEncoding=utf-8 設(shè)置讀取mysql數(shù)據(jù)庫中數(shù)據(jù)的時候的編碼格式
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://你的端口號:3306/estore?characterEncoding=utf-8 username=???mysql數(shù)據(jù)庫的賬號 password=???mysql數(shù)據(jù)庫的密碼 maxActive=30 maxWait=3000
下面在給大家補(bǔ)充介紹:java中常見的中文亂碼總結(jié)
亂碼現(xiàn)象產(chǎn)生的原因:由于編碼方式的不同,才會出現(xiàn)亂碼的情況。
哪里會產(chǎn)生亂碼:1.頁面 2.url地址 3.數(shù)據(jù)庫亂碼 4.數(shù)據(jù)提交(form,ajax) 5.開發(fā)工具
怎么解決:
1.統(tǒng)一開發(fā)工具的編碼設(shè)置
2.設(shè)置應(yīng)用服務(wù)器的編碼方式,如:端口號,編碼方式
3.數(shù)據(jù)庫本身的編碼方式
4.強(qiáng)制設(shè)置request和response的數(shù)據(jù)編碼方式(同時也可以采用過濾器的方式攔截所有的編碼方式)
5.采用代碼方式強(qiáng)轉(zhuǎn)數(shù)據(jù)編碼方式(UrlEncode.encode("你好","utf-8"))
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
Java的外部類為什么不能使用private和protected進(jìn)行修飾的講解
今天小編就為大家分享一篇關(guān)于Java的外部類為什么不能使用private和protected進(jìn)行修飾的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04
Java開發(fā)或調(diào)用WebService的幾種方式總結(jié)
java開發(fā)過程中,很多地方都會遇到數(shù)據(jù)傳遞,遠(yuǎn)程獲取數(shù)據(jù)問題,這篇文章主要介紹了Java開發(fā)或調(diào)用WebService的幾種方式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06
java實現(xiàn)小i機(jī)器人api接口調(diào)用示例
這篇文章主要介紹了java實現(xiàn)小i機(jī)器人api接口調(diào)用示例,需要的朋友可以參考下2014-04-04

