本篇文章為大家展示了如何理解WEB開發(fā)中的苦大難字符集問題,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
目前創(chuàng)新互聯(lián)建站已為1000多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、余慶網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
記得剛做javaweb開發(fā)的時(shí)候被這個(gè)編碼問題搞得暈頭轉(zhuǎn)向,經(jīng)常稀里糊涂的編碼正常了一會(huì)編碼又亂了。那個(gè)時(shí)候迫于項(xiàng)目進(jìn)度大多都是知其然不知其所以然。后來(lái)有時(shí)間就把整個(gè)體系搞了個(gè)遍,終于摸通了來(lái)龍去脈。
在C++的CGI開發(fā)時(shí)大家喜歡用latin,這個(gè)屬于字節(jié)方式的編碼格式,存儲(chǔ)MySQL節(jié)約空間,而C++也是比較容易控制到byte級(jí)別的語(yǔ)言。所以經(jīng)過框架封裝基本也問題不大。
在Java語(yǔ)言中,要涉及修改編碼問題的地方還真多。一個(gè)地方?jīng)]有設(shè)好就會(huì)亂碼滿天飛。大概總結(jié)包括以下這幾部分:瀏覽器、
擴(kuò)展,瀏覽器識(shí)別編碼的順序:
1.如果HTTP頭部申明了charset,則會(huì)使用HTTP頭部的,
2.讓HTTP頭部沒有設(shè)置,則會(huì)去解析meta標(biāo)簽的,
3.如果meta也沒有的話,瀏覽器會(huì)根據(jù)是否設(shè)置了auto detect來(lái)進(jìn)行編碼識(shí)別,
4.否則會(huì)使用本地UI的字符編碼。
服務(wù)器:
對(duì)于JSP等動(dòng)態(tài)語(yǔ)言,需要在jsp頭部設(shè)置編碼格式,J2EE服務(wù)器解析這個(gè)JSP的時(shí)候才會(huì)把整個(gè)頁(yè)面編碼為UTF-8輸出,不然就按照系統(tǒng)默認(rèn)編碼格式ISO-8859-1輸出了。JSP設(shè)置格式如下:
<%@ page language= "java" contentType = "text/html; charset=UTF-8" pageEncoding ="UTF-8" %>
大家都知道,JSP對(duì)應(yīng)的就是servlet。servlet的編碼對(duì)應(yīng)如下設(shè)置:
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{ response.setContentType("text/html;charset=utf-8"); }
還有不要漏掉大家常用的spring工具類,編碼轉(zhuǎn)換filter,很實(shí)用。在你用struts、spring mvc時(shí)這個(gè)過濾器幫你轉(zhuǎn)換沒有設(shè)置的編碼過濾。如下設(shè)置:
Set Character Encoding org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8
萬(wàn)一還有亂碼怎么辦呢?doGet方式的參數(shù)傳遞肯定會(huì)有亂碼問題。只需要在tomcat的監(jiān)聽器里設(shè)置編碼字符集如下(文件一般存儲(chǔ)在 /tomcat安裝目錄/conf/server.xml ):
大家在開發(fā)的時(shí)候別忘了java文件本身也是有編碼格式的。在類文件右鍵查看屬性。
如果開發(fā)時(shí)忘記更改文件的編碼格式,windows默認(rèn)是GBK的,后來(lái)又要一直到utf8編碼的linux怎么辦。文件巨多,總不能一個(gè)一個(gè)去更改吧。其實(shí)很簡(jiǎn)單,只需要在java命令的環(huán)境參數(shù)設(shè)置 -Dfile.encoding=GBK 解決。
編譯java代碼時(shí),如果使用ant需要在javac里設(shè)置編譯的字符集。這樣打印的log輸出到文件或者控制臺(tái)上就不會(huì)亂碼了。
maven編譯時(shí)設(shè)置的字符集:
< artifactId> maven-compiler-plugin < version> 2.5 < configuration> < optimize> true < showDeprecation> false < debuglevel> lines,source < source> 1.6 < target> 1.6 < encoding> UTF-8 < meminitial> 128m < maxmem> 768m configuration>
sqlmap的sql xml,sping的xml 也是需要設(shè)置的,因?yàn)樯婕暗娇缙脚_(tái)。 頂上添加:
數(shù)據(jù)庫(kù):
這里列出大家用的最多的Mysql字符集設(shè)置。打開mysql的配置文件( linux 一般在 /etc/my.cnf ,windows在mysql的安裝目錄 my.ini)。設(shè)置如下:
[mysqld] default-character-set = utf8 [ mysql] character_set_server = utf8
jdbc需要設(shè)置
jdbc : mysql://192.168.0.237:3306/dzh_db?useUnicode=true&characterEncoding=UTF-8
這些都設(shè)置了一般的中文是不會(huì)有問題的。
不過最近出現(xiàn)了一個(gè)問題很搞怪。以前以為所有的字符只要設(shè)置好了所有數(shù)據(jù)都可以錄入數(shù)據(jù)庫(kù),結(jié)果有些字符就不行,比如●■★這類型的。后來(lái)把這些字符變成字節(jié)碼,居然不是三位utf8的,我擦,大汗淋漓。后來(lái)查詢可以通過過濾utf8 特殊字符的方式處理。
public static String Utf2String (byte buf[]) { int len = buf.length ; StringBuffer sb = new StringBuffer(len / 2); for (int i = 0; i < len; i++) { if (by2int(buf[i]) <= 0x7F) sb.append(( char ) buf[i]); else if (by2int(buf[i]) <= 0xDF && by2int(buf[i]) >= 0xC0) { int bh = by2int(buf[i] & 0x1F); int bl = by2int(buf[++i] & 0x3F); bl = by2int(bh << 6 | bl); bh = by2int(bh >> 2); int c = bh << 8 | bl; sb.append(( char ) c); } else if (by2int(buf[i]) <= 0xEF && by2int(buf[i]) >= 0xE0) { int bh = by2int(buf[i] & 0x0F); int bl = by2int(buf[++i] & 0x3F); int bll = by2int(buf[++i] & 0x3F); bh = by2int(bh << 4 | bl >> 2); bl = by2int(bl << 6 | bll); int c = bh << 8 | bl; // 空格轉(zhuǎn)換為半角 if (c == 58865) { c = 32; } sb.append(( char ) c); } } return sb.toString(); }
或者把mysql的字符集改為 utf8mb4 ,記得這個(gè)只有mysql55支持哦!
[mysqld] default-character-set =utf8mb4 [ mysql] character_set_server = utf8mb4
操作系統(tǒng):
windows默認(rèn)是gbk,一般不需要變動(dòng)。不過大家又想每個(gè)文件都要建立為utf8格式怎么辦,不可能我們每個(gè)文件建立后都去用屬性改變一下?太麻煩!直接在eclipse設(shè)置后,同種類型的文件建立都會(huì)是utf8格式。
linux,可以有兩個(gè)地方修改基本就足夠了:
vi /etc/sysconfig/i18n
修改
LANG="zh_CN.GB3212" LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN" SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
vi /etc/profile
export LC_ALL="zh_CN.GB2312" export LANG="zh_CN.GB2312"
上述內(nèi)容就是如何理解WEB開發(fā)中的苦大難字符集問題,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。