资讯专栏INFORMATION COLUMN

JavaWeb中文乱码初探

eccozhou / 1003人阅读

摘要:一前言在开发的过程中,难免会出现中文乱码的问题。接下来写的是我在解决中文乱码问题时的学习心得,一是为了能加深印象,二是希望能帮初学者们解决一些疑惑。二正文之所以会出现中文乱码,是因为在进行时的编码方式不正确。

一、前言
  在开发JavaWeb的过程中,难免会出现中文乱码的问题。接下来写的是我在解决中文乱码问题时的学习心得,一是为了能加深印象,二是希望能帮初学者们解决一些疑惑。如有说的不对的地方,希望及时指出批评。

二、正文
之所以会出现中文乱码,是因为在进行I/O时的编码方式不正确。而I/O主要有磁盘I/O和网络I/O。下边我们就从编写一个Java文件开始进行分析。

1.编写文件

比如当创建一个文本文件,内空写上“My name is 王某某”,然后直接Ctrl+S保存。再双击打开这个文件时理所当然的能看到正确内容。但是当使用Sublime来打开这个文件时(使用UTF-8编码打开),却出现这种情况:

原因是在使用Ctrl+S直接保存文件的时候,采用的是ANSI编码(打开刚刚的文本文件,另存为,可以看到使用的是哪种编码方式

什么是ANSI编码方式呢?在简体中文Windows操作系统中,ANSI代表的是GBK编码。也就是说刚刚编写的文件,在保存的时候使用了GBK编码,打开时用的是UTF-8编码,当然会出现乱码了。
所以为了解决从网上下载的代码打开时有乱码这种情况,只要设置打开文件的编码方式和该文件本身的编码方式一致就可以了。当设置文件的编码方式为ISO-8859-1时,不要在文件中写入中文字符

2.将Java文件编译成class文件

无论在编写java文件时使用的是何种编码方式,在编译成class文件后,都是一样的Unicode编码(准确说是UTF-16编码)。

3.JVM加载class文件

JVM加载class文件使用的是Unicode编码方式。就是说之前在编写Java文件时,如果在文件中出现了

String s="中文字符";

定义的字符串在内存中都是以Unicode编码的形式存在。
这里只是说从class文件中加载进来的字符串,不是说所有的的内存中的字符串

内存中的字符串不仅有从class文件中加载进来的,还有从磁盘文件中读取的、从数据库中读取的、从请求中读取的等等。要保证不出现乱码问题,当然是要确定字符串来源的编码方式,然后再以对应的编码方式来转换。

4.在控制台打印乱码

创建2个Java文件,一个是ANSI编码,一个是Utf-8编码,2个Java文件的main方法里都写入以下代码:

String s="i我";
System.out.println(s);

然后使用cmd进行编译(在编译utf-8编码的文件时要在命令后加-encoding utf-8),然后运行,都正常。


然后!我就在eclipse里进行开发了!我将项目的文件编码设置成utf-8:

但是!结果却打印了乱码!

而且连Servlet中响应的内容也乱码了!弄到这里的时候我找了挺多文章都没有能解决的。然后请教了一位前辈,让我这样来设置Eclipse的编码方式:Window--Preferences--Workspace

然后就解决了eclipse中打印和输入乱码问题了。之前Eclipse出现乱码的原因我也没想明白,难道是编译时没有使用UTF-8编码吗?希望知道的前辈能够指点一下,感激不尽。

5.输出

Servlet中设置请求和响应对象的编码方式就可以了,这个没啥好说的了。

req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65794.html

相关文章

  • JavaWeb 乱码问题终极解决方案!

    摘要:经常有读者在公众号上问乱码的问题,昨天又有一个小伙伴问及此事,其实这个问题很简单,但是想要说清楚却并不容易,因为每个人乱码的原因都不一样,给每位小伙伴都把乱码的原因讲一遍也挺费时间的,因此,松哥今天决定写一篇文章,和大伙好好捋捋中的乱码问题 经常有读者在公众号上问 JavaWeb 乱码的问题,昨天又有一个小伙伴问及此事,其实这个问题很简单,但是想要说清楚却并不容易,因为每个人乱码的原因...

    canger 评论0 收藏0
  • Javaweb Q&A

    摘要:方法的参数不但可以使相对于上下文根的路径,而且可以是相对于当前的路径。如和都是合法的路径。 转发与重定向区别是什么 在调用方法上 转发 调用 HttpServletRequest 对象的方法 request.getRequestDispatcher(test.jsp).forward(req, resp); 重定向 调用 HttpServletResponse 对象的方法 res...

    hiyang 评论0 收藏0
  • JavaWEB开发08——Response

    摘要:文件拷贝的模板代码会自动关闭但是,如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况,原因是不同的浏览器默认对下载文件的编码方式不同,是编码方式,而火狐浏览器是编码方式。 1.HttpServletResponse概述 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表...

    lavor 评论0 收藏0
  • JavaWEB开发09——Request

    摘要:概述在创建时会覆盖方法,或这些方法都有两个参数,一个为代表请求的和代表响应。方法中的的类型是,而方法的的类型是,是的子接口,功能和方法更加强大。 1.HttpServletRequest概述 在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。 service方法中的re...

    张巨伟 评论0 收藏0
  • javaweb开发之servlet初始

    摘要:概述是公司提供的一门用于开发动态资源的技术。把开发好的类部署到服务器中。应用程序被停止或重新启动之前,引擎将卸载,并在卸载之前调用的方法。 servlet概述 Servlet是sun公司提供的一门用于开发动态web资源的技术。 Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤: (1)...

    Cheriselalala 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<