Javaweb項目中文亂碼總結

  在項目開發中,常常會碰見中文字符串亂碼出現,好比:從前臺傳到後臺出現亂碼,從後臺存入數據庫出現亂碼,從後臺到頁面展現出現亂碼。爲了之後避免遇到相似問題,咱們有必要對字符串從頁面到數據,從數據庫到頁面,字符串會通過哪些編碼關卡作個整理。html

  1.從頁面到後臺出現中文亂碼mysql

  從頁面提交數據到後臺,會存在兩種提交方式——get和post。針對這兩種提交方式,會有不一樣的編碼處理過程。linux

  get請求,通過Tomcat默認編碼(tomcat8以前默認編碼是ISO-8859-1,tomcat8以後改成UTF-8)進行前臺數據編碼,由於tomcat版本不一樣,咱們作的操做也不同,那麼咱們先說說tomcat8版本以前的作法,首先,咱們在tomcat安裝目錄下找到sever.xml文件,同時在該文件中找到<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />代碼,在該代碼中添加一個屬性:URIEncoding,將該屬性值設置爲UTF-8,便可讓Tomcat(默認ISO-8859-1編碼)以UTF-8的編碼處理get請求。修改後的代碼:sql

<Connector port="8080"  protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

  post請求,request.getParamter()獲取頁面數據時,默認以ISO8859-1編碼,針對這種狀況,爲了解決全部頁面編碼問題,咱們能夠寫EncodingFilter進行request請求攔截,同時對全部接收的數據進行統一編碼設置。關於該Filter的寫法,不是此處詳解,你們能夠自行百度。數據庫

  2.從後臺到數據出現中文亂碼vim

  一般出現這種狀況,多數是因爲數據庫的問題,由於前臺傳回來的數據經過上個步驟已經沒問題,只要不作特殊處理,就不會出現中文亂碼問題,但也有特殊狀況,好比我最近碰見的,poi導入excel文件,後臺接收時,遍歷每行每列數據返回Object類型,須要用String強轉存入數據庫中,而問題就出如今這裏,String存儲數據時,若是不指定編碼格式,會採用當前系統默認編碼方式,據我查閱,windows平臺的默認編碼方式:gb2312,linux平臺默認編碼方式:utf-8。怎麼去查詢兩個平臺的默認編碼。windows

  windows下,咱們能夠寫個demo,代碼以下:tomcat

public static void main(String[] args) {
        Properties p = System.getProperties();
        System.out.println(p.getProperty("file.encoding"));
    }

  linux下,經過命令:locale服務器

  

  針對windows平臺處理方式:post

 new String(((String) Obejct).getBytes(),"utf-8");

  這步沒問題了,剩下數據庫了。在這一步我就碰見了大麻煩,出現的問題:在本地上傳excel到數據庫(mysql)沒問題,而上傳linux雲服務器上(數據庫也是msyql)就出現了亂碼,經查閱資料,解決方法以下:

  a.查詢linux服務器上mysql的數據庫默認編碼,代碼以下:

show variables like 'character%';

  效果以下:

  b.修改my.cnf文件,代碼以下:

vim /etc/my.cnf

 效果以下:

 

  在紅色框標識的代碼下,添加以下代碼:

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

  重啓mysql服務器(linux服務器版本:Centos 7),代碼以下:

systemctl restart mysql.service

  若是碰見一直沒有反應,則先關閉在啓動達到重啓效果,代碼以下:

systemctl stop mysql.service  //關閉服務器
systemctl start mysql.service //啓動服務器

  3.從後臺到頁面出現亂碼

  能夠在1步驟中的EncodingFilter中添加代碼對response編碼,示例代碼以下:

response.setContentType("text/html;charset=utf-8");
相關文章
相關標籤/搜索