Janet's Dream

          隱形的翅膀o(∩_∩)o...

           

          Java亂碼問題解決方案

          Java亂碼問題一直是困擾初學者的一個難題,下面就根據筆者的經驗來給大家一個解決方案。我寫了一個Demo的web應用,解決了亂碼問題,點擊下載。

          1  問題來源

                Java的亂碼問題,根源在于操作系統、數據庫(MySQL)、Web服務器(Tomcat)、頁面(JSP)中的編碼不一致造成的。例如,mysql的編碼是latin1,而頁面上字符的編碼是GBK,則就會出現亂碼問題。

          2  解決方案

                 了解了亂碼產生的原因,下面就來看一下如何解決亂碼。事實上,只要保證各個環節的編碼一致,就不會產生亂碼,所以只要將所有的環節,設置的編碼為UTF-8,就不會出現亂碼了(為了支持國際化,建議統一設置成UTF-8)。

          3  mysql數據庫編碼的設置(以MySQL 5.0.41為例)

          •     查看數據庫支持的編碼:show character set;

          這樣可以查看mysql數據庫支持的所有編碼,其中可以看到有支持utf8編碼。
          mysql> show character set ;

          +----------+-----------------------------+---------------------+--------+

          | Charset  | Description                 | Default collation   | Maxlen |

          +----------+-----------------------------+---------------------+--------+

          | big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |

          | dec8     | DEC West European           | dec8_swedish_ci     |      1 |

          | cp850    | DOS West European           | cp850_general_ci    |      1 |

          | hp8      | HP West European            | hp8_english_ci      |      1 |

          | koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |

          | latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |

          | latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |

          | swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |

          | ascii    | US ASCII                    | ascii_general_ci    |      1 |

          | ujis     | EUC-JP Japanese             | ujis_japanese_ci    |      3 |

          | sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |      2 |

          | hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |

          | tis620   | TIS620 Thai                 | tis620_thai_ci      |      1 |

          | euckr    | EUC-KR Korean               | euckr_korean_ci     |      2 |

          | koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |      1 |

          | gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |      2 |

          | greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |

          | cp1250   | Windows Central European    | cp1250_general_ci   |      1 |

          | gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |

          | latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |

          | armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |      1 |

          | utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 |

          | ucs2     | UCS-2 Unicode               | ucs2_general_ci     |      2 |

          | cp866    | DOS Russian                 | cp866_general_ci    |      1 |

          | keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |      1 |

          | macce    | Mac Central European        | macce_general_ci    |      1 |

          | macroman | Mac West European           | macroman_general_ci |      1 |

          | cp852    | DOS Central European        | cp852_general_ci    |      1 |

          | latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |      1 |

          | cp1251   | Windows Cyrillic            | cp1251_general_ci   |      1 |

          | cp1256   | Windows Arabic              | cp1256_general_ci   |      1 |

          | cp1257   | Windows Baltic              | cp1257_general_ci   |      1 |

          | binary   | Binary pseudo charset       | binary              |      1 |

          | geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |      1 |

          | cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |      2 |

          | eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |      3 |

          +----------+-----------------------------+---------------------+--------+

          36 rows in set (0.00 sec

          • 查看數據庫默認的編碼: show variables like '%character%'

          mysql> show variables like '%character%';

          +--------------------------+---------------------------------------+

          | Variable_name            | Value                                 |

          +--------------------------+---------------------------------------+

          | character_set_client     | latin1                                |

          | character_set_connection | latin1                                |

          | character_set_database   | latin1                                |

          | character_set_filesystem | binary                                |

          | character_set_results    | latin1                                |

          | character_set_server     | latin1                                |

          | character_set_system     | utf8                                  |

          | character_sets_dir       | E:\mysql-5.0.41-win32\share\charsets\ |

          +--------------------------+---------------------------------------+

          8 rows in set (0.00 sec)

          可以看到,mysql數據庫中,此時有關字符串的設置的參數,其中“character_set_server”為創建數據庫是默認的編碼,現在需要將其修改為utf8。

          • 修改數據庫默認的編碼:set character_set_server='utf8';

          mysql> set character_set_server='utf8';

          Query OK, 
          0 rows affected (0.00 sec)

                 執行改命令后,可以看到數據庫此時的默認編碼改為utf8

          mysql> show variables like '%character%';

          +--------------------------+---------------------------------------+

          | Variable_name            | Value                                 |

          +--------------------------+---------------------------------------+

          | character_set_client     | latin1                                |

          | character_set_connection | latin1                                |

          | character_set_database   | latin1                                |

          | character_set_filesystem | binary                                |

          | character_set_results    | latin1                                |

          | character_set_server     | utf8                                  |

          | character_set_system     | utf8                                  |

          | character_sets_dir       | E:\mysql-5.0.41-win32\share\charsets\ |

          +--------------------------+---------------------------------------+

          8 rows in set (0.00 sec)

                 此時,創建數據庫和表如果不指定字符集,則也會使用uft8的編碼了。

          • 查看schema和table編碼:


          show create database  數據庫名;

          show create table 表名;


          例如存在這樣一個數據庫mydbdefault,mydbdefault中有一個表test

          mysql> use mydbdefault;

          Database changed

          mysql
          > show create database mydbdefault;

          +-------------+-----------------------------------------------------------------

          -------+

          | Database    | Create Database

                 
          |

          +-------------+-----------------------------------------------------------------

          -------+

          | mydbdefault | CREATE DATABASE `mydbdefault` /*!40100 DEFAULT CHARACTER SET latin1 */ |

          +-------------+-----------------------------------------------------------------

          -------+

          1 row in set (0.00 sec)

          數據庫mydbdefault的編碼為latin1

          mysql> show create table test;

          +-------+-----------------------------------------------------------------------

          -------------------+

          | Table | Create Table

                             
          |

          +-------+-----------------------------------------------------------------------

          -------------------+

          | test  | CREATE TABLE `test` (

            `id` 
          int(20default NULL

          ) ENGINE
          =MyISAM DEFAULT CHARSET=latin1 |

          +-------+-----------------------------------------------------------------------

          -------------------+

          1 row in set (0.00 sec)


          表的編碼為latin1

          • 修改schema和table編碼:


          alter database 數據庫名 character set utf8;
          alter table 表名 character set utf8;


          既然查出數據庫和表的編碼都不是uft8,所以此時要將數據庫和表的字符集改成utf8。

          mysql> alter database mydbdefault character set utf8;

          Query OK, 
          1 row affected (0.00 sec)

           

          mysql
          > show create database mydbdefault;

          +-------------+-----------------------------------------------------------------

          -----+

          | Database    | Create Database

               
          |

          +-------------+-----------------------------------------------------------------

          -----+

          | mydbdefault | CREATE DATABASE `mydbdefault` /*!40100 DEFAULT CHARACTER SET utf

          */ |

          +-------------+-----------------------------------------------------------------

          -----+

          1 row in set (0.00 sec)

           

          mysql
          > alter table test character set utf8;

          Query OK, 
          0 rows affected (0.03 sec)

          Records: 
          0  Duplicates: 0  Warnings: 0

           

          mysql
          > show create table test;

          +-------+-----------------------------------------------------------------------

          -----------------+

          | Table | Create Table

                           
          |

          +-------+-----------------------------------------------------------------------

          -----------------+

          | test  | CREATE TABLE `test` (

            `id` 
          int(20default NULL

          ) ENGINE
          =MyISAM DEFAULT CHARSET=utf8 |

          +-------+-----------------------------------------------------------------------

          -----------------+

          1 row in set (0.00 sec)


          • 在不知道默認的編碼方式的情況下,創建數據庫和表時,最好指定字符編碼為utf8:


          create database 數據庫名 character set utf8;

          create table 表名 (….) character set utf8;


          有關mysql的字符集的命令,可以mysql的參考手冊http://dev.mysql.com/doc/refman/5.1/zh/charset.html


          4  Tomcat編碼的設置(以Tomcat 6.0.14版本為例)


          在Tomcat的安裝目錄下,找到TOMCAT_HOME\conf\server.xml,然后找到以下代碼,在其后加上URIEncoding="UTF-8"

              <Connector port="8080" protocol="HTTP/1.1" 

                         connectionTimeout
          ="20000" 

                         redirectPort
          ="8443" URIEncoding="UTF-8"/>

          5  web應用中編碼處理

                 在web應用中,為了確保提交的字符串為uft-8的,可以編寫一個過濾器filter,過濾器的在web.xml中的配置如下:

          對應的SetCharacterEncodingFilter類代碼如下:

                 <filter>

                        
          <filter-name>Set Character Encoding</filter-name>

                        
          <filter-class>

                               com.fengmanfei.util.SetCharacterEncodingFilter

                        
          </filter-class>

                        
          <init-param>

                               
          <param-name>encoding</param-name>

                               
          <param-value>UTF-8</param-value>

                        
          </init-param>

                 
          </filter>

                 
          <filter-mapping>

                        
          <filter-name>Set Character Encoding</filter-name>

                        
          <url-pattern>/*</url-pattern>

                 </filter-mapping>

          過濾器的代碼如下所示:

          package com.fengmanfei.util;

           

          import java.io.IOException;

           

          import javax.servlet.Filter;

          import javax.servlet.FilterChain;

          import javax.servlet.FilterConfig;

          import javax.servlet.ServletException;

          import javax.servlet.ServletRequest;

          import javax.servlet.ServletResponse;

           

          public class SetCharacterEncodingFilter implements Filter {

           

                 
          private String encoding = "UTF-8";

           

                 
          public void doFilter(ServletRequest request, ServletResponse response,

                               FilterChain chain) 
          throws IOException, ServletException {

           

                        request.setCharacterEncoding(encoding);

                        chain.doFilter(request, response);

           

                 }

           

                 
          public void init(FilterConfig filterConfig) throws ServletException {

                        String s 
          = filterConfig.getInitParameter("encoding");

                        
          if (s != null) {

                               encoding 
          = s;

                        }

           

                 }

           

                 
          public void destroy() {

           

                 }

          }

          其中,關鍵的是通過過濾器,將request請求設置UTF-8編碼

          6     數據庫連接URL

          jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8


          7    頁面中編碼處理

          在jsp頁面上,同時也要設置頁面編碼方式

          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


          8  Eclipse中編碼的設置

                 最后,在使用Eclipse時,要將工作區的編碼也設置為UTF-8,選擇“Window”|“Preference”|“General”|“Workspace”,將Text file encodeing 改為UTF-8,如圖所示:






          posted on 2008-08-25 11:35 Janet 閱讀(1938) 評論(3)  編輯  收藏 所屬分類: JAVA Tips

          評論

          # re: Java亂碼問題解決方案 2008-08-25 15:13 ∪∩BUG

          感謝你的文章讓我沒有走入誤區里,jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8
          這個我以前一直是GBK,還好沒有開始任何項目開發,還在自學中...

          我是計算機專業網絡方向的,請長者多多指教.  回復  更多評論   

          # re: Java亂碼問題解決方案 2008-08-25 15:59 cheneystar

          有時候這樣不一定能夠處理所有的亂碼問題類  回復  更多評論   

          # re: Java亂碼問題解決方案 2008-08-25 23:35 geronimo

          geronimo 的亂碼問題呢?  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          Professor

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 加查县| 阿巴嘎旗| 彩票| 老河口市| 平原县| 江门市| 巴彦县| 科技| 平湖市| 巧家县| 吐鲁番市| 平阳县| 惠安县| 利川市| 金阳县| 南华县| 玉龙| 梁河县| 临桂县| 黄冈市| 大邑县| 揭东县| 大余县| 崇仁县| 蛟河市| 吉木萨尔县| 大姚县| 即墨市| 陆良县| 如东县| 天津市| 阳谷县| 秀山| 衢州市| 鹤山市| 楚雄市| 突泉县| 大足县| 崇信县| 岳西县| 嘉祥县|