`

谈谈WEB开发中的苦大难字符集问题

    博客分类:
  • java
阅读更多

记得刚做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文件本身也是有编码格式的。在类文件右键查看属性。
eclipse属性

 










 

如果开发时忘记更改文件的编码格式,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 &lt; len; i++) {

if (by2int(buf[i]) &lt;= 0x7F)
sb.append(( char ) buf[i]);
else if (by2int(buf[i]) &lt;= 0xDF &amp;&amp; by2int(buf[i]) &gt;= 0xC0) {
int bh = by2int(buf[i] &amp; 0x1F);
int bl = by2int(buf[++i] &amp; 0x3F);

bl = by2int(bh &lt;&lt; 6 | bl); bh = by2int(bh &gt;&gt; 2);
int c = bh &lt;&lt; 8 | bl;
sb.append(( char ) c);
} else if (by2int(buf[i]) &lt;= 0xEF &amp;&amp; by2int(buf[i]) &gt;= 0xE0) {
int bh = by2int(buf[i] &amp; 0x0F);
int bl = by2int(buf[++i] &amp; 0x3F);
int bll = by2int(buf[++i] &amp; 0x3F);

bh = by2int(bh &lt;&lt; 4 | bl &gt;&gt; 2);
bl = by2int(bl &lt;&lt; 6 | bll);

int c = bh &lt;&lt; 8 | bl;
// 空格转换为半角
if (== 58865) {
= 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格式。

eclipse属性2

 































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开发中的苦大难字符集问题

0
3
分享到:
评论

相关推荐

    大数据开发笔试.docx

    【大数据开发笔试知识点详解】 1. **HDFS原理与模块职责**: HDFS(Hadoop Distributed File System)是分布式文件系统,它将大文件分割为Block并分散...这些知识点对于理解大数据开发中的数据存储和处理至关重要。

    数字电子基础 课后习题大难

    在数字电子技术中,首先要理解二进制数系统,它是数字电路的基础。二进制数由0和1组成,能够表示和处理各种数据。通过学习,我们需要掌握二进制数的加减乘除运算规则,以及与十进制、十六进制等其他数制之间的转换。...

    初中语文文摘人生大难

    1. **心理暗示**:故事中的老太太预感到“大难”,她的担忧无形中影响了村民们的情绪,导致了一种集体的心理暗示。心理暗示是指一个人接受到某种信息后,不自觉地受到影响,改变了原有的信念或行为。在故事中,儿子...

    运用迁移原理读与写解决学生作文三大难.docx

    ### 运用迁移原理读与写解决学生作文三大难 #### 摘要与引言 随着社会经济的发展,教育的地位日益凸显,特别是在培养人文素养和塑造健全人格方面,语文教育发挥着不可替代的作用。作文作为语文教育的重要组成部分...

    计算机毕业论文写作也答辩

    使用数据库如CNKI、Web of Science等进行深入的文献检索。 3. 提出假设或研究问题:根据调研结果,明确你要解决的问题或验证的假设,这将成为论文的核心。 4. 研究设计:制定研究方法和实验方案,包括数据采集、...

    超全面c#面试题集合上百家大中型IT公司面试题目含答案

    - 在Visual Studio中使用“添加Web引用”功能。 23. **.NET Remoting的工作原理:** .NET Remoting提供了一种机制,使得不同进程甚至是不同计算机上的对象能够互相通信。 24. **null字符串与空字符串的区别:** ...

    关于Datasheet的下载

    我是初级,下载个软件大难了。。。。我是初级,下载个软件大难了。。。。我是初级,下载个软件大难了。。。。我是初级,下载个软件大难了。。。。我是初级,下载个软件大难了。。。。我是初级,下载个软件大难了。。...

    中科大算法设计与分析课堂作业答案

    【算法设计与分析】是计算机科学中的核心课程之一,它主要关注如何有效地解决问题,并通过数学模型和编程技术来实现高效算法。在这个中科大的研究生课程中,学生们深入学习了概率算法、分布式算法和近似算法这三个...

    某集团强化综合管理、提高企业效益.pptx

    裕华纺织集团的问题反映出部分国有企业在应对市场变化时的不适应,可能存在“船大难掉头”的现象,即大型企业改革调整困难。然而,有些企业能在困境中保持稳定,这归功于其高效的经营管理。案例中提到,即便在销售...

    单片机实验

    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

    java语言程序设计 基础篇 第6版课后答案

    书中不仅涵盖了Java语言的基础知识,比如数据类型、控制结构、类与对象等核心概念,还逐步深入到面向对象设计的三大特性:封装、继承和多态。此外,它还介绍了异常处理、集合框架、输入/输出流、线程以及基本的GUI...

    西工大机械设计基础课后习题答案.doc

    机械设计基础课程的主要目标是使学生掌握机械设计的基本原理和方法,并具备独立设计和解决机械设计问题的能力。 根据题目所给的信息,我们可以总结出以下几个知识点: 1. 机械零件常用的材料有钢、铸铁、有色金属...

    无声的感动作文.doc

    这篇读后感不仅是一篇优秀的范文,还让我们深入思考了人性的美好和生活的价值,提醒我们在日常生活中要懂得感恩,传递正能量,同时也教育我们要有责任心,勇于付出,无论是在大灾大难面前,还是在日常琐事之中。

    深井软岩巷道围岩变形数值模拟分析及控制研究

    针对山西省晋东南地区某深部矿井东二南采区轨道大巷变形大难支护问题,采用数值分析方法,分析得出了巷道应力变形规律。结果显示:巷道变形剧烈的临界深度为800 m,深部巷道剪应力在左、右肩达到8.7 MPa左右,在距巷道...

    成都市中考语文试卷及答案解析精选.doc

    在成都市的中考语文试卷中,对于学生而言,这不仅是检验其过去几年学习成效的关卡,更是引导他们深入理解和运用汉语言文化的契机。试卷内容丰富多样,体现了语文学科的基础性和实用性,以下将逐一对试卷中的知识点...

    精彩演讲范文:以团结互助为荣.pdf

    每个人应该在日常生活中积极践行团结互助的价值观,无论是在面对大灾大难,还是在平凡的日常生活中,都要以团结互助为荣。团结互助是我们共同的财富,是我们战胜困难、不断前行的强大力量来源。让我们在今后的生活中...

    计算机网络考试试题及答案

    包括了六部分各类计算机网络技术考试试题及大难

    数值分析答案

    数值分析是计算机科学和工程领域中的一个重要分支,它主要研究如何用近似计算方法解决实际问题,特别是那些涉及复杂数学模型的问题。本资源包含了数值分析的答案,这对于正在学习这个主题的学生或研究人员来说是非常...

    氟化工行业产业链深度研究报告

    HF生产三废量大难处理,排污问题严重。由于涉及氟元素,无水氢氟酸生产过程中往往会产生巨大量的工业三 废,且在生产过程中产生含氟污染物处理难度较高,工业废物产生成本较高,生产企业规范性参差不齐,故行 业整体...

Global site tag (gtag.js) - Google Analytics