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