记得刚做javaweb开发的时候被这个编码问题搞得晕头转向,经常稀里糊涂的编码正常了一会编码又乱了。那个时候迫于项目进度大多都是知其然不知其所以然。后来有时间就把整个体系搞了个遍,终于摸通了来龙去脉。
在C++的CGI开发时大家喜欢用latin,这个属于字节方式的编码格式,存储mysql节约空间,而C++也是比较容易控制到byte级别的语言。所以经过框架封装基本也问题不大。
在Java语言中,要涉及修改编码问题的地方还真多。一个地方没有设好就会乱码满天飞。大概总结包括以下这几部分:浏览器、服务器、数据库、操作系统。
浏览器:
如果使用模板语言,html需要设置显示的字符集。这个适用于浏览器判断什么编码显示。
1
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
扩展,浏览器识别编码的顺序:
1.如果HTTP头部申明了charset,则会使用HTTP头部的,
2.让HTTP头部没有设置,则会去解析meta标签的,
3.如果meta也没有的话,浏览器会根据是否设置了auto detect来进行编码识别,
4.否则会使用本地UI的字符编码。
服务器:
对于JSP等动态语言,需要在jsp头部设置编码格式,J2EE服务器解析这个JSP的时候才会把整个页面编码为UTF-8输出,不然就按照系统默认编码格式ISO-8859-1输出了。JSP设置格式如下:
1
2 |
<%@ page language= "java" contentType = "text/html; charset=UTF-8"
pageEncoding ="UTF-8" %> |
大家都知道,JSP对应的就是servlet。servlet的编码对应如下设置:
1
2 3 4 |
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException{ response.setContentType("text/html;charset=utf-8"); } |
还有不要漏掉大家常用的spring工具类,编码转换filter,很实用。在你用struts、spring mvc时这个过滤器帮你转换没有设置的编码过滤。如下设置:
1
2 3 4 5 6 7 8 9 10 |
<filter>
<filter-name> Set Character Encoding</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name> encoding</param-name> <param-value> UTF-8</param-value> </init-param> </filter> |
万一还有乱码怎么办呢?doGet方式的参数传递肯定会有乱码问题。只需要在tomcat的监听器里设置编码字符集如下(文件一般存储在 /tomcat安装目录/conf/server.xml ):
1
2 3 |
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8" /> |
大家在开发的时候别忘了java文件本身也是有编码格式的。在类文件右键查看属性。
如果开发时忘记更改文件的编码格式,windows默认是GBK的,后来又要一直到utf8编码的linux怎么办。文件巨多,总不能一个一个去更改吧。其实很简单,只需要在java命令的环境参数设置 -Dfile.encoding=GBK 解决。
编译java代码时,如果使用ant需要在javac里设置编译的字符集。这样打印的log输出到文件或者控制台上就不会乱码了。
1
|
<javac debuglevel= "source,lines" source= "1.6" encoding= "utf-8">
|
maven编译时设置的字符集:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 |
< artifactId> maven-compiler-plugin </artifactId >
< version> 2.5 </version > < configuration> < optimize> true </optimize > < showDeprecation> false </showDeprecation > < debuglevel> lines,source </debuglevel > < source> 1.6 </source > < target> 1.6 </target > < encoding> UTF-8 </encoding > < meminitial> 128m </meminitial > < maxmem> 768m </maxmem > </ configuration> |
sqlmap的sql xml,sping的xml 也是需要设置的,因为涉及到跨平台。 顶上添加:
1
|
<!--?xml version="1.0" encoding="UTF-8"?-->
|
数据库:
这里列出大家用的最多的Mysql字符集设置。打开mysql的配置文件( linux 一般在 /etc/my.cnf ,windows在mysql的安装目录 my.ini)。设置如下:
1
2 3 4 5 |
[mysqld]
default-character-set = utf8 [ mysql] character_set_server = utf8 |
jdbc需要设置
jdbc : mysql://192.168.0.237:3306/dzh_db?useUnicode=true&characterEncoding=UTF-8
这些都设置了一般的中文是不会有问题的。
不过最近出现了一个问题很搞怪。以前以为所有的字符只要设置好了所有数据都可以录入数据库,结果有些字符就不行,比如●■★这类型的。后来把这些字符变成字节码,居然不是三位utf8的,我擦,大汗淋漓。后来查询可以通过过滤utf8 特殊字符的方式处理。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
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; // 空格转换为半角 if (c == 58865) { c = 32; } sb.append(( char ) c); } } return sb.toString(); } |
或者把mysql的字符集改为 utf8mb4 ,记得这个只有mysql55支持哦!
1
2 3 4 5 |
[mysqld]
default-character-set =utf8mb4 [ mysql] character_set_server = utf8mb4 |
操作系统:
windows默认是gbk,一般不需要变动。不过大家又想每个文件都要建立为utf8格式怎么办,不可能我们每个文件建立后都去用属性改变一下?太麻烦!直接在eclipse设置后,同种类型的文件建立都会是utf8格式。
linux,可以有两个地方修改基本就足够了:
vi /etc/sysconfig/i18n
修改
1
2 3 |
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
1
2 |
export LC_ALL="zh_CN.GB2312"
export LANG="zh_CN.GB2312" |
原创文章,转载请注明: 转载自Lanceyan
本文链接地址: 谈谈WEB开发中的苦大难字符集问题
相关推荐
大数据开发笔试全文共4页,当前为第1页。大数据开发笔试全文共4页,当前为第1页。1、 hdfs原理,以及各个模块的职责 大数据开发笔试全文共4页,当前为第1页。 大数据开发笔试全文共4页,当前为第1页。 答:Hadoop ...
初中语文文摘人生大难
数字电子基础 阎石第五版 课后习题答案
我是初级,下载个软件大难了。。。。我是初级,下载个软件大难了。。。。我是初级,下载个软件大难了。。。。我是初级,下载个软件大难了。。。。我是初级,下载个软件大难了。。。。我是初级,下载个软件大难了。。...
毕业论文写作也答辩 详细说明论文写作的流程与注意要点。资料的收集处理等。最后提示答辩时的注意事项
有些外商公司可能针对某些工商时事问题询问应试者,不只是想了解应试者对时事问题的常识,并从中分析应试者的意见及观念,面对这类问题不只须对时事做一番解说,最好能在结论时加上自己的观点。
应用瓦斯氧化低温热风回用技术提高蓄热氧化炉热效率的方法,以及应用背压式汽轮机和后置机组合热电联产技术解决机组平稳运行与丁集煤矿热负荷波动大难适应问题的方法。最后,分析了丁集煤矿超低浓瓦斯氧化利用工程的...
压缩文件中是详细的中科大研究生算法设计与分析课程的作业答案,包含概率算法,分布式算法,近似算法三部分作业的。
ORG 0000H ...取SAVE中保存数据输出到cfa0端口 ACALL DISP POP ACC ;出栈 MOV R5,A POP PSW POP ACC SETB EA ;允许外部中断 RETI DISP: MOV DPTR,#OUTPORT CPL A MOVX @DPTR,A RET END
西工大机械设计基础课后习题答案.doc
针对山西省晋东南地区某深部矿井东二南采区轨道大巷变形大难支护问题,采用数值分析方法,分析得出了巷道应力变形规律。结果显示:巷道变形剧烈的临界深度为800 m,深部巷道剪应力在左、右肩达到8.7 MPa左右,在距巷道...
课后题的答案比较齐全,pdf的文档,我用过,绝对不错
C++面向对象程序设计习题实验及答案答案大难
包括了六部分各类计算机网络技术考试试题及大难
HF生产三废量大难处理,排污问题严重。由于涉及氟元素,无水氢氟酸生产过程中往往会产生巨大量的工业三 废,且在生产过程中产生含氟污染物处理难度较高,工业废物产生成本较高,生产企业规范性参差不齐,故行 业整体...
针对复合陶瓷材料Al2O3/SiO2/ZrO2脆性大难加工等问题,结合选择性激光烧结(SLS)工艺成形复合陶瓷粉末,采用Nd:YAG激光器及其送粉装置进行激光烧结试验.利用扫描电镜(SEM)、能量色散X射线光谱仪(EDX)和X射线...
网站变黑白JS,遇到大难,虽把网页变黑白色,此JS可实现。
俗话说“船大难掉头”,在这场“唯快不破”的较量中,银行这艘IT航母有点carry不起来了。但是精明的银行IT人怎能甘于人后呢?我们就来找找银行里哪些场景适合首先应用超融合。
根据厚煤层综放开采窄小煤柱沿空巷道围岩变形大难支护的特点,分析了影响综放沿空巷道围岩稳定性的因素,根据合锚杆、锚索、金属网和U型钢不同支护方式作用机理,设计了"锚索网+U型钢"联合支护方式,并对锚杆和锚索的锚...
自动控制原理 谢克明 答案,手写版的,毕竟这本书的大难不好找,凑合吧