本文主要介绍java中常见的中文乱码及其解决方法,主要包括读取字节码文件时出现的乱码。本文通过示例代码给大家做了非常详细的介绍,具有很好的参考价值。感兴趣的朋友可以跟随边肖去看一看。
:
目录
1.IO流2中读取文件时出现乱码的问题。读取字节码文件时出现乱码的问题3。使用Servlet过滤器统一设置整个Servlet项目中的各种编码格式。从阿里云服务器上的mysql数据库读取数据产生的中文乱码。
1.IO流中读取文件时出现乱码问题
1,先记录从文件中读取的数据(当new File())并逐级打包,直到字节输入流(new BufferReader())缓冲并设置编码格式。
//文件路径
字符串路径='???';
//读取文件
File file=新文件(路径);
//包装到文件字节输入流中
file inputstream fis=new file inputstream(file);
//下面的流可以理解为从字节流到字符流的桥梁。
//并且InputStreamReader可以在创建对象时传入所需字符编码的参数。
//这里的数字是“utf-8”
InputStreamReader ISR=new InputStreamReader(fis,' utf-8 ');
//将InputStreamReader包装到BufferReader中。
BufferedReader br=新buffered reader(ISR);
2.字节码文件读取时出现的乱码问题
我在使用eclipse的过程中遇到了一个转码问题。eclipse安装后,在项目属性资源中写的是默认编码格式是GBK。我从来没有换成UTF-8,学习过程中也没有问题,因为GBK编码一直都是统一使用的。
直到有一天我在汤姆猫上运行我Servlet写的代码时发现了一个有趣的现象。
如果我使用response将中文内容直接发送到服务器,就不会出现乱码。
` resp.getwriter()。println ('h1我喜欢吃/h1 ');
但使用BufferReader的readline()方法读取中文内容时,会出现乱码。我试过,无论我修改IO流中读取的字符的编码格式,还是整个项目的编码格式,都无法改变这个乱码问题。
BufferedReader br=新buffered reader(fr);
Br.readLine()//"汤姆!"在这条线下面的图片中
我咨询了我的老师,得到了一个新的解决方案。
向该类添加一行代码。这段代码的意思是检查虚拟机的启动参数。运行后,可以在控制台上看到下图的信息(只剪切了部分片段)。您可以看到有一个名为file.encoding的属性,其值为GBK。
我个人的分析可能是,我创建项目的时候用的是GBK编码,然后我自己跑项目。类的字节码文件已经生成。这时,如果我只在项目中右键单击Properties,就来不及修改编码格式了。
//检查虚拟机启动参数
System.getProperties()。list(system . out);
老师临时给了个解决办法,在这节课会出现乱码的那一行前加了一行。
system . set property(“file . encoding”,“utf-8”);
上面提到的VM参数中file.encoding的值现在更改为utf-8。
其实最根本的解决方法就是在项目创建之初就设定好编码格式,如果像我这样来不及的话可以临时使用这个方法。
3.使用Servlet过滤器Filter统一设置整个Servlet项目中的各种编码格式
Servlet提供了三个组件:servlet filer监听器。
在设置编码格式时,我们可以预设一个全局过滤器,
创建一个过滤器类并添加一个注释@WebFilter(eclipse会在创建过滤器类时自动创建这个注释)。我在这里直接写了/*,表示这个项目中的所有请求都必须先经过这个过滤器的过滤。
@WebFilter('/* ')
公共类EncodingFilter实现筛选器{
公共编码过滤器(){
}
@覆盖
公共void init(FilterConfig fConfig)引发ServletException {
//过滤器初始化时调用,打印输出
//Servlet默认为延迟加载模式
system . out . println(' encoding filter已初始化.');
}
@覆盖
public void destroy() {
//当过滤器被破坏时调用,打印输出
system . out . println(' encoding filter被销毁..');
}
//doFilter方法相当于筛子
//一共四行代码是我们提出的三个需求和一个发布代码。
@覆盖
公共void doFilter(ServletRequest请求,ServletResponse响应,FilterChain链)引发IOException,ServletException {
//设置解析消息的编码格式。
request . setcharacterencoding(' utf-8 ');
//设置用于返回响应的编码格式。
response . setcharacterencoding(' utf-8 ');
//告诉浏览器响应内容是文本和html,文件编码格式是utf-8
response . set content type(' text/html;charset=utf-8 ');
//释放请求
//它包含有关请求来自何处以及将去往何处的信息。
chain.doFilter(请求,响应);
}
}
除了简介的评论形式,过滤器的功能是基于Servlet中的web.xml文件。打开web.xml文件,并在根目录中添加以下代码。
过滤器
!-标签的名字-
过滤器名称编码/过滤器名称
!-标签类别的位置-
filter-classcom.zyj.day02.EncodingFilter/filter-class
/过滤器
过滤映射
!-相应标签的名称-
过滤器名称编码/过滤器名称
!-声明范围的范围-
url模式/*/url模式
/filter-映射
虽然内容比较简单,但是写起来比较复杂,建议用注释来实现功能。
值得一提的是
通过向filter类的init方法添加print语句,我们发现如果您在类名上标记了注释,并在web.xml文件中添加了配置,那么当请求到来时,我们会发现init方法在控制台上执行了两次。虽然目前看起来没什么问题,但总的来说,只有一个。
4,从阿里云服务器上的mysql数据库中读取数据产生的中文乱码
问题描述:
当我在servlet中连接数据库时,我打算实现一个写功能和一个读功能。
本来可以通过sql语句流畅地编写中文,可以在数据库中查询中文,可以在控制台上读取和打印数据。整个过程没有出现乱码问题,但是当我想使用直接从数据库读取中文的“小张”作为我项目中具有登录功能的账号时,发现无法读取正确的数据,于是判断我在账号框中输入的“小张”不存在。我当时是初学阶段,还是找不出哪部分编码格式不一样。
找到了解决方案:
在项目中druid-config.properties(阿里云druid的配置文件)的url属性后拼接一个?CharacterEncoding=utf-8设置从mysql数据库读取数据时的编码格式。
driver class name=com . MySQL . JDBC . driver
Url=jdbc:mysql://你的端口号:3306/estore?字符编码=utf-8
用户名=?mysql数据库的帐号
密码=?mysql数据库的密码
maxActive=30
maxWait=3000
下面补充介绍:java常见中文乱码汇总。
乱码产生的原因:乱码会因为编码方式不同而出现。
哪里是乱码:1。第2页,url地址3。数据库乱码4。数据提交(表单,ajax) 5。开发工具
如何解决:
1.开发工具的统一编码设置
2.设置应用服务器的编码方式,如端口号和编码方式。
3.数据库本身的编码模式
4.强制设置请求和响应的数据编码方法(同时,可以使用过滤器拦截所有编码方法)
5.通过代码强制数据编码(urlencode ('Hello ',' utf-8 '))
这就是本文的全部内容。希望这篇文章的内容能给你的学习或者工作带来一些帮助,同时也希望你能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。