其實也就三層:
1、前端頁面
2、后臺代碼
3、數(shù)據(jù)庫
1量九、前端
前端就是設(shè)置頁面的字符集
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
2、前端接受的數(shù)據(jù)傳入后臺
一般我們是通過request.getParameter("XXX")方式獲取數(shù)據(jù)的,但是就算前端頁面字符集是正確的荠列,也有可能在這一層出現(xiàn)問題类浪。
因為傳遞中文的時候,有可能用A編碼拆解成Byte去傳遞弯予,結(jié)果還原的時候使用B編碼還原戚宦,這就導(dǎo)致原來的數(shù)據(jù)出現(xiàn)亂碼或者个曙?锈嫩??垦搬。呼寸。。等問題猴贰。
因此对雪,我們可以通過*String里面不同的構(gòu)造方法來解決這個問題。(我們在第3部分米绕,來修正這個問題)
3瑟捣、后臺代碼
這里分為兩塊講:
1)
先設(shè)置開發(fā)工具的編碼類型,一般來說是默認是gbk栅干,但是這里我用utf-8迈套,所以就得修改
有兩個地方要改:
Windows里面的Preferences(首選項框),在general里面找workspace碱鳞,右側(cè)有text file encoding桑李,改為utf-8(這個是開發(fā)ide的字符集修改)
鼠標點擊你的項目最頂層,然后在project里面找到這個項目的字符編碼窿给,改為utf-8(項目的字符集修改)
2)
因為我如上所說的問題贵白,所以代碼要在獲取數(shù)據(jù)之前指明request和response的編碼類型(我這里都用utf-8)
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
設(shè)置完成之后,可以這么獲取中文字符崩泡!
String name = new String(request.getParameter("name").getBytes("utf-8"), "utf-8"));
這里寫了兩個utf-8大家就會有點迷茫禁荒,其實是這個意思,第一個utf-8是說明從前端拿過來的byte是什么編碼格式的角撞,第二個utf-8是指定把我的String字符串轉(zhuǎn)換成什么編碼格式呛伴。
一般來說使用new String(request.getParameter("name").getBytes(),"utf-8");就可以,盡量避免字符串的編碼轉(zhuǎn)來轉(zhuǎn)去靴寂,這樣會出現(xiàn)效率低下的問題磷蜀,記得,先嘗試用最簡單的方式獲取百炬,然后在后臺打印下它的值褐隆,如果顯示正常,那么證明設(shè)置的沒有問題剖踊!
關(guān)于后臺代碼庶弃,能改的差不多就這些
4衫贬、后臺代碼通過jdbc寫sql將數(shù)據(jù)傳入數(shù)據(jù)庫(mysql為例)
這里還是有個比較惡心的地方,就是mysql如果你的字符集沒有設(shè)置歇攻,或者沒有設(shè)置好的話固惯,默認是latin1
那么你的utf-8直接傳過來還是會出問題。
因此mysql的url要這樣寫:
//useUnicode表示允許使用自定義的Unicode,
//characterEncoding是給定自定義的Unicode是什么
String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
我之前遇到中文在數(shù)據(jù)庫中顯示缴守?葬毫??(問號)的問題屡穗,就是因為沒有拼接上這兩個參數(shù)贴捡。因此mysql解析從后臺代碼傳過去的字符串的時候,通過編碼類型去解析村砂,所以就顯示不出正確的中文烂斋!
5、最后一步就是mysql字符集的設(shè)置
其實應(yīng)該先分清楚有哪些字符集可以設(shè)置础废?
1)mysql的某個庫的字符集查看
可以通過use databasename;然后show variables like "%chara%"; 這個命令先查看下自己所使用的那個庫的字符集都是什么
character_set_client為客戶端編碼方式汛骂;
character_set_connection為建立連接使用的編碼方式;
character_set_database為數(shù)據(jù)庫的編碼方式评腺;
character_set_results是結(jié)果集的編碼方式帘瞭;
character_set_server為數(shù)據(jù)庫服務(wù)器的編碼方式。
只要保證以上采用的編碼方式一樣歇僧,就不會出現(xiàn)亂碼問題图张。
可以用如下的命令去修改:
set character_set_database="utf8";
以此類推,改成如上圖所示(或者符合自己的要求即可)诈悍。
然后可能會出現(xiàn)重啟完mysql修改的值就失效祸轮。可以在my.ini的文件中的[mysqld]標簽中設(shè)置:
default-character-set=utf8(但是這個是老版本的設(shè)置方式侥钳,具體什么版本适袜,沒測過實在抱歉)
據(jù)說新版本是:
character_set_server=utf8這個來代替之前的設(shè)置(大家可以自己嘗試下哪個生效)
設(shè)置完之后,mysql重啟下舷夺,應(yīng)該字符編碼就沒問題了
2)mysql當(dāng)中苦酱,用戶所使用的某個數(shù)據(jù)庫的字符集
這個就是創(chuàng)建數(shù)據(jù)庫的時候設(shè)置的字符編碼
CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
utf8_general_ci是一種校對規(guī)則,有興趣可以自己研究下给猾。
也可以在連接工具上直接編輯數(shù)據(jù)庫疫萤,來修改數(shù)據(jù)庫的字符集!
3)某個具體數(shù)據(jù)庫中的某張表的字符集
這個就是創(chuàng)建某張表的時候指定字符編碼
CREATE TABLE mytable(
id varchar(40) NOT NULL default '',
userId varchar(40) NOT NULL default ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
也可以在連接工具上直接改變表敢伸,來修改表的字符集扯饶!
其實就是把所有能改的地方全部改成utf-8(在數(shù)據(jù)庫中是utf8,沒有中間的 “ - ” ,千萬別加上去了)
提醒下尾序,記得遇到報錯钓丰,要一層一層排錯!
1每币、首先是前端傳到后臺的數(shù)據(jù)携丁,在后臺能正常打印嗎?
2兰怠、其次是后臺傳輸?shù)綌?shù)據(jù)庫中的這個過程有沒有問題梦鉴?
3、數(shù)據(jù)庫的字符編碼都是一樣的嗎痕慢?
像2和3這兩個方面尚揣,你可以拿一條帶中文的數(shù)據(jù)涌矢,直接在數(shù)據(jù)庫里面insert一條掖举,如果插入進去,并且中文沒有異常娜庇,證明數(shù)據(jù)庫這邊是沒有問題的塔次,那么就是傳輸時候的問題,很有可能是上述講的url沒有拼接那兩條參數(shù)名秀。
作者:lsr40
來源:CSDN
原文:https://blog.csdn.net/lsr40/article/details/78736855
版權(quán)聲明:本文為博主原創(chuàng)文章励负,轉(zhuǎn)載請附上博文鏈接!