JavaWeb项目中关于乱码的一点思考

首先声明,以下内容不一定正确,但是合理:

今天在写一个Web项目时用get方式携带着一些中文参数发送到服务器,服务器接收,验证合理性,然后插入数据库

整个过程中产生了几次乱码现象,一开始很是费解,尝试各种网上的解决方案无果后开始自己思考和测试,发现了一些端倪,故做个记录,也请看这个帖子的人讨论一下其正确性。

首先从get方法的URL中接收中文参数,然后在接收端直接获取后输出的话产生了第一次乱码现象,这个原因是

URL提交过来是按照ISO-8859-1编码方式编码的,一开始误以为URL的编码方式可以用URLEncoder去设置,其实URLDecoder做的只是表面上的工作,而并非修改了机器底层存储的0和1,所谓表面工作,就好比,“你”这个字用符号$1代替(这里只是随便举个例子)然后在服务器端用URLDecoder把字面上的$1还原回"你",有点像在字面上进行了加密解密工作,其实实际上这些中文字还是以ISO-8859-1编码提交到了tomcat,假设“你”这个字以ISO-8859-1编码存储在底层的数据是0101,当Tomcat接收到了0101后把他用String
s封装起来,这个时候如果你打印system.out.println(s)时就有可能出现乱码,究其原因是因为,你的本地默认编码不是ISO-8859-1,这样的话Java会把0101显示为按照本机默认编码所对应的那个符号,通过cmd chcp命令可以查看本机默认编码,我的机器是GBK,假如在GBK中0101代表“@”符号的话,这时候你打印出来的就是@,所以如果你想打印的时候不出现乱码,可以通过String s = new String(s.getBytes("ISO-8859-1"),"本机默认编码方式"),将编码进行一下转换后再输出,这样“你”这个字就会从ISO-8859-1的0101转化成本机默认编码所对应的那个01序列,比如在GBK下“你”对应1010,那么这时候s在底层的存储就从0101变成了1010,有时候你可能还会发现如果你进行这样的转化也可以得到正确的中文输出:String(s.getBytes("ISO-8859-1"),"GB2312")(假设本机编码为GBK),这是因为GB2312是GBK的子集,GBK是GB2312的扩充版,所以这样做虽然大部分时候是正确的,但是当遇到GBK中包含而GB2312中不包含的字符时,显示就会出错。

然后我把这个乱码问题解决了后将数据写入数据库当中,再从MySql的命令行select一下发现又乱码了,原因是我的数据库jdbc:mysql://127.0.0.1:3306/open_push?characterEncoding=UTF-8导致的,因为上一步我已经将编码转化为了GBK,然后我却告诉数据库我给你的数据是UTF-8编码的(假如数据库中表存放数据是按照GB2312存放的),这样数据库就会以为你给他的汉字是UTF-8的编码方式而不是GBK,他在将你给他的汉字转化成GB2312编码方式的时候就是去查询的UTF-8转GB2312的编码转化表而不是GBK转GB2312的编码转化表,这样就造成了转码错误,自然显示的数据就不会正确了,所以你要不想出现乱码问题就必须老老实实的告诉数据库你给他的数据是按照什么编码方式来编码的,这就是设置characterEncoding的作用,假如你给的编码是GBK,你就需要设置characterEncoding=GBK,假如你给的是UTF-8就设置characterEncoding=UTF-8,这时候你可能会发现你在数据库的命令行中select的一下还是出现了乱码,你会惊奇我明明告诉了数据库我给你的是UTF-8编码了呀,为什么还给我展示的是乱码,我猜想这可能不能怪数据库,因为数据库确确实实是按照UTF-8给你存储的数据,只不过你select出来以后,命令行展示给你看这个过程采用的还是你的本地默认编码GBK,所以就导致了select出来的显示的是乱码,如果你修改一下你机器的默认编码方式为UTF-8的话,显示的结果就会是正确的。

时间: 2024-10-14 19:48:27

JavaWeb项目中关于乱码的一点思考的相关文章

log4j在javaWeb项目中的使用

在前边的文章中对log4j的配置文件进行了说明,今天介绍如何在普通的javaWeb项目中使用log4j. 在日常的开发过程中,日志使用的很频繁,我们可以利用日志来跟踪程序的错误,程序运行时的输出参数等,很多情况下可能会使用System.out.println()这个方法,但是还有一种更加简洁的方式,那就是使用日志框架,今天就看看log4j这个日志框架如何在javaWeb的类中使用. 一.log4j的配置文件 我们要使用log4j必须要有log4j的配置文件,前面一篇文章提到,log4j的配置文件

javaWeb项目中web.xml的xsd( XML Schemas Definition)文件

<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://java.sun.com/xml/ns/javaee" xmlns:javaee="http://java.sun.com/xml/ns/javaee" xml

Druid使用起步—在javaWeb项目中配置监控 连接池

当我们在javaWEB项目中使用到druid来作为我们的连接池的时候,一定不会忘了添加监控功能.下面我们就来看一下,在一个简单的web项目中(尚未使用任何框架)我们是如果来配置我们的web.xml来完成我们的监控配置 首先是过滤器filter的配置,在web.xml中添加如下配置 <servlet> <servlet-name>DruidStatView</servlet-name> <servlet-class>com.alibaba.druid.supp

JavaWeb 项目中的绝对路径和相对路径以及问题的解决方案

最近在做JavaWeb项目,总是出现各种的路径错误,而且发现不同情况下 /  所代表的含义不同,导致在调试路径上浪费了大量时间. 在JavaWeb项目中尽量使用绝对路径  因为使用绝对路径是绝对不会出错的,而使用相对路径可能会出现错误. 首先 说下在JavaWeb项目中的绝对路径和相对路径的含义 绝对路径: 相对于当前Web应用根路径的路径  也就是任何路径都必须要带上contextPath =  http://localhost:8080/WebProject/ 相对路径: 相对于当前目录的路

对于JavaWeb项目中web.xml文件中Servlet的基本配置有一些小记录写在这里,并做参考,有新的及时更新

对于JavaWeb项目中web.xml文件中Servlet的基本配置有一些小记录写在这里,并做参考,有新的及时更新 <?xml version="1.0" encoding="UTF-8"?> <web-app> <!-- 在创建web项目时,若是系统自动生成,上面会有一串配置信息,因为不影响大局,这里没有列出--> <!-- 流程: 当在网页中使用/login时,发现不是网页,则会在web.xml找寻对应的名字,由url-

关联分析FPGrowth算法在JavaWeb项目中的应用

关联分析(关联挖掘)是指在交易数据.关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式.关联.相关性或因果结构.关联分析的一个典型例子是购物篮分析.通过发现顾客放入购物篮中不同商品之间的联系,分析顾客的购买习惯.比如,67%的顾客在购买尿布的同时也会购买啤酒.通过了解哪些商品频繁地被顾客同时购买,可以帮助零售商制定营销策略.分析结果可以应用于商品货架布局.货存安排以及根据购买模式对顾客进行分类. FPGrowth算法是韩嘉炜等人在2000年提出的关联分析算法,在算法中使用了一种

Javaweb编程中的乱码问题

程序中的乱码问题,主要出现在我们处理中文数据的过程中出现.从浏览器向服务器请求数据,服务器返回的数据在浏览器中显示为乱码.或者是服务器中的java文件用到中文,也有可能会出现乱码.数据库在处理数据的时候,也会碰到乱码问题. 乱码问题总的来说,就是编码方式不同造成的,在数据的建立.传输.处理以及显示过程中,如果处理数据的编码方式不同,就会很容易造成中文的乱码问题.解决的办法宏观上说,就是在数据处理的各个环节都采用统一的编码方式,这样就可以避免乱码问题的发生. 对于JavaWeb编程来说,主要涉及到

javaWeb项目中如何实现在线查看pdf文件

最近有需求要实现在网页直接查看pdf,word,excel文件.但是实际当中并没有很好的开源插件供我们使用,确实有一些付费的插件不错,也很好用,但是对于我来说都不适合. 现在只是单纯的找到了围魏救赵的方法. 就是先实现显示pdf文件,其他文件用别的方式去转成pdf.虽然这个方法确实不好,但是也是没有办法的办法了,如果以后能有更好的,那就再发布别的吧. 这里我就直接介绍pdf的显示方法. 直接上干货. 首先在E:\tomcat8\webapps这个目录下面拷贝下面这个文件 http://yunpa

关于intellij idea 中javaweb项目中使用jstl报错500错误问题

问题截图如下 taglib红色说明项目中没有导入jstl相关jar包 在tomcat中运行后,报错如下 解决办法 1.找到相关jar包(jstl.jar/standard.jar)拷贝到项目的lib目录下 2.在modules添加这两个jar包到工程的 lib中 3.在artifacts导入到output中 一切OK!