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