java处理乱码
1. javaweb怎么处理中文乱码问题
中文乱码问题真的是一个很棘手的问题,特别是从前台传到后台之后,都不知道问题出在哪里了。现在分享解决javaWEB中前后台中文乱码问题的3种方法。
方法一:
tomcat的自带编码是ISO-8859-1的格式,是不兼容中文的编码的。所以我们从后台接收的时候要注意。
采用相同的格式去接收(ISO-8859-1),然后用能解析的编码(utf-8)去转换。这样我们就能得到能兼容中文的格式了。这样处理之后发往前台。注意:发往前台的时候也需要设置一下
resp.setContentType("text/html;charset=utf-8");//设置页面的字符编码,解决界面显示中文乱码的问题
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//因为tomcat自带编码是ISO-8859-1格式
//解决乱码方法之一
<span style="white-space:pre"> </span>String name=req.getParameter("username");
<span style="white-space:pre"> </span>String pwd=req.getParameter("pwd");
<span style="white-space:pre"> </span>byte[] b=name.getBytes("ISO-8859-1");//用tomcat的格式(iso-8859-1)方式去读。
<span style="white-space:pre"> </span>String str=new String(b,"utf-8");//采用utf-8去接string
<span style="white-space:pre"> </span>resp.setContentType("text/html;charset=utf-8");//设置页面的字符编码<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>PrintWriter pw =resp.getWriter();
<span style="white-space:pre"> </span>String str1="<html><body><font size='5px' color='red'>username:"+name+"pwd:"+pwd+"</font></body></html>";
<span style="white-space:pre"> </span>pw.print(str1);
PrintWriter pw =resp.getWriter();
String str1="<html><body><font size='5px' color='red'>username:"+name+"pwd:"+pwd+"</font></body></html>";
pw.print(str1);
方法二:
由于方法一比较繁琐,采用用了简单的设置。只需要简单的一句就可以搞定
req.setCharacterEncoding("utf-8");//必须写在第一位,因为采用这种方式去读取数据,否则数据会出错。
这样就不用像之前的那样繁琐的设置了
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//因为tomcat自带编码是ISO-8859-1格式
//解决乱码二《法一比较繁琐》
req.setCharacterEncoding("utf-8");//必须写在第一位,因为采用这种方式去读取数据,否
则数据会出错。
//设置这样方式去读。这样中文就能够读取出来了,但是需要注意。表单的发送方式必须是<span style="color:#ff0000;"> method='post'</span>
resp.setContentType("text/html;charset=utf-8");//设置传过去的页面显示的编码
String name=req.getParameter("username");
String pwd=req.getParameter("pwd");
PrintWriter pw =resp.getWriter();
String str1="<html><body><font size='5px' color='red'>username:"+name+"pwd:"+pwd+"</font></body></html>";
pw.print(str1);
方法三:
这是在法二的基础上修改的。虽然我们能修改编码格式去读,但是考虑到用户肯定不会修改,所以我们需要采用比较通用的办法,让用户修改配置文件。也就是web.xml文件
需要修改web.xml里面的内容,就是说,字符编码从xml接收过来。需要在xml文件中配置参数。
代码如下:
<servlet>
<servlet-name>Encodeing</servlet-name>
<servlet-class>cn.hncu.com.encode.Encodeing</servlet-class>
<init-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>//这里面的内容可供用户自己填写(必须是编码格式)
</init-param>
</servlet>
我们知道前台和后台进行交换必须经过web.xml配置
我们需要获取web.xml的设置的参数
public void init(ServletConfig config) throws ServletException {
charset=config.getInitParameter("charset");//获得初始化参数。当然charset需要设置为全局变量。后面的service函数需要设置req.setCharacterEncoding(charset);
}
req.setCharacterEncoding(charset);
resp.setContentType("text/html;charset=utf-8");
String name=req.getParameter("username");
String pwd=req.getParameter("pwd");
PrintWriter pw =resp.getWriter();
String str1="<html><body><font size='5px' color='red'>username:"+name+"pwd:"+pwd+"</font></body></html>";
pw.print(str1);
2. java出现乱码怎么解决
你的类名和文件名都不一样怎么编译。
把wjsw.java改成HelloWorld.java
3. 如何解决Java中的中文乱码问题
如果你的项目编码是utf-8的话,右键项目properties-->Resource-->others 下拉框改为utf-8。望采纳:)
4. java程序执行中文乱码如何解决
看你编译没问题,运行时报乱码错误。说明是代码的编码跟DOS系统的编码不一致。
DOS系统是ASCII码,你看一下你代码的编码是什么,应该不是ASCII码,你把你的代码编码转换成ASCII码试试先,不行再转成UTF-8试试,这样应该就解决了(如果是编码不一致的问题的话)
5. java代码中文乱码怎么解决方法
解决乱码问题:可以修改eclipse里的编码格式来解决乱码问题:
1、window--> Preference
6. 打开java文件都是乱码怎么解决
文件编码不一致,修改文件编码utf-8。
如果是class文件乱码,找反编译软件打开。
7. eclipse java代码中文乱码怎么解决
您好,将别人的项目或JAVA文件导入到自己的Eclipse中时,常常会出现JAVA文件的中文注释变成乱码的情况,主要原因就是别人的IDE编码格式和自己的Eclipse编码格式不同。
总结网上的建议和自己的体会,可以参考以下几种解决方式:
1
改变整个文件类型的编码格式
1)
eclipse->window->preferences->General->Content
Types
2)
找到要修改的文件的类型(JAVA,JSP等等),在下面有个Default
encoding,在输入框中输入GBK
3)
点击Update
4)
点击OK
5)
重启eclipse
2
改变整个Eclipse工作空间的编码格式
1)
eclipse->window->preferences->General->workspaceTypes
2)
改变文本文件编码格式为GBK
3
改变单个文件的编码格式
,在包资源管理器右键点击文件->属性,改变文本文件编码格式为GBK
4
如果以上几种方式仍不能解决,可以下面这个不得已的办法:
用Editplus打开要转码的文件,如果在Editplus中没有乱码,可直接将文件内容拷贝到Eclipse中,如果Editplus也有乱码,可先
在Editplus转码,Editplus->文档->文件编码方式->改变文件编码方式->GBK,然后再用Eclipse打
开就可以了。
5,打开Eclipse,有时候会出现中文注释乱码,这是因为Eclipse中对Text
file
encoding的默认编码是GBK,因此,右键点击你的“工程”,将Info中的“Text
file
encoding”中的Other改为UTF-8,即可!
8. java爬虫一段话里的部分字符乱码解决
1. 网络爬虫乱码的原因。
源网页的编码与抓取后的编码转换不一致。如果源网页是gbk编码的字节流,程序在我们抓取后直接用utf-8编码输出到存储文件,这必然会造成乱码,即当源网页编码与程序抓取后直接处理编码一致时,就不会出现乱码,然后统一字符编码后也就不会出现乱码。注意区分源网络代码A,程序B直接使用的代码,统一转换字符的代码C。
2. 是网页的服务器端代码。
B.捕获的数据原本是字节数组,由A编码,只有B=A才能保证不会出现乱码;否则,当字符集不兼容时,就会出现乱码字符。这一步常用于测试。
c、统一转码是指在获得网页的原始编码A后进行统一编码,主要是将每个网页的数据统一成一种编码,往往首选字符集较大的utf-8。
每个网页都有自己的代码,比如gbk,utf-8,iso8859-1,日本jp系统代码,西欧,俄语等等。爬行时,所有类型的代码都将被扩展。有的爬虫只是简单的识别网页,然后统一编码,有的则直接按照utf-8统一处理,不需要判断源网页,显然会造成乱码。
3. 乱码的解决方案。
根据原因找到解决办法很简单。
1) 确定源网页的代码a。
代码a通常位于网页的三个位置,即httpheader的内容、网页的元字符集和网页标题中的文档定义。获取源网页代码时,依次判断这三部分数据,从头到尾优先级相同。
理论上这是对的,但是国内有些网站不符合标准。比如写出来的gbk其实是utf-8,有的写出来是utf-8,其实是gbk。当然这是几个网站,但是确实存在。因此,在确定网页编码时,应该对这种特殊情况给予特殊处理,如中文检查、默认编码等策略。
在另一种情况下,如果以上三种都没有编码信息,一般使用第三方的网页编码智能识别工具,如cpdetector。原理是通过统计字节数组的特性来计算实际编码,有一定的准确率,但是我发现在实践中准确率还是很有限的。
但是综合以上三种编码确认方法后,中文乱码的问题几乎可以完全解决。在我的基于nutch1.6的网络爬虫系统中,经过统计,编码准确率可以达到99.99%,这也证明了上述方法和策略的可行性。
2) 程序通过代码b还原源网页数据。
显然,这里的B应该等于a,在java中,如果源网页的字节数组是source_byte_array,就会转换成stringstr=newstring(source_byte_array,B)。即这些字节数组对应的字符被正确编码显示在内存中,此时打印结果正常。此步骤通常用于调试或控制台输出测试。
3) 统一转码。
网络爬虫系统中有很多数据源。如果无法使用数据,它将被转换为其原始数据,如果这样做是浪费的。所以一般爬虫系统要对抓取的结果进行统一编码,做到一致,使用方便。此时,在(2)的基础上,可以进行统一的编码转换,在java中的实现如下。
源网页的字节数组是source_byte_array。
转换为普通字符串:stringnormal_source_str=newstring(source_byte_array,c)。这时候可以直接用javaapi存储,但是字符串往往不直接写。因为一般爬虫存储是将多个源网页存储在一个文件中,所以要记录字节偏移量,所以下一步。 再将得到的str转换为统一的编码C格式的字节数组,则byte[] new_byte_array=normal_source_str.getBytes(C)即可,此时即可用java io api将数组写入文件,并记录相应的字节数组偏移量等,待真正使用时,直接io读取即可。
爬虫过程不仅会存在乱码问题,还会存在网站爬取涉及法律、IP受限,爬取行为受限等等问题,这个时候就需要不断去解决这些问题。
9. 如何解决JavaWeb乱码问题
request-line中的URL部分必须以application/x-www-form-urlencoded方式编码。编码时使用的字符集是当前网页在浏览器上显示时所使用的字符集。
JDK中专门有两个类处理application/x-www-form-urlencoded类型的数据,它们是URLEncoder及URLDecoder。当网页上的数据需要手动进行URLEncoding处理时,可使用URLEncoder类完成编码工作。需要手动进行URLEncoding处理的位置包括:
链接(<a></a>)中的href标签属性;
以POST方式提交的表单(<form></form>)中的action标签属性。
<!--不正确的写法-->
<ahref="/hello/checkUser.html?opt=中文>使用者身份验证"</a>
<!--使用UTF-8字符集进行URLEncoding的结果-->
<ahref="/hello/checkUser.html?opt=%E4%B8%AD%E6%96%87">使用者身份验证</a>
<%@pageimport="java.net.URLEncoder"%>
<ahref="/hello/checkUser.html?opt=<%=URLEncoder.encode("中文","UTF-8")%>">使用者身份验证</a>
<formaction="checkUser.html?opt=xxx"method="POST">
<inputtype="text"name="username"value="yyy"/>
<inputtype="text"name="username"value="zzz"/>
<inupttype="submit"value="submit"/>
</form>
Stringopt=request.getParameter("opt");
String[]users=request.getParameterValues("username");
Stringopt=request.getParameter("opt");
if(opt!=null&&!"".equals(opt)){
opt=newString(opt.getBytes("ISO-8859-1"),"UTF-8");
}
importjava.io.IOException;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
{
privateStringencoding;
publicCharacterEncodingFilter(){
encoding=null;
}
publicvoiddestroy(){
encoding=null;
}
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException{
request.setCharacterEncoding(encoding);
chain.doFilter(request,response);
}
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
encoding=filterConfig.getInitParameter("encoding");
if(encoding==null||"".equals(encoding)){
encoding="UTF-8";
}
}
}
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>
CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
例如,网页上不应该产生这样的链接:
[xhtml]view plain
正确的写法是:
[xhtml]view plain
为此,方案之一可以在JSP网页上使用脚本化语言进行URLEncoding处理。如:
[xhtml]view plain
request-body的编码处理
request-body只有在POST提交的方式下才会产生。request-body的编码方式由表单的enctype标签属性指定,同request-line一样,编码request-body时使用的字符集也是当前网页在浏览器上显示时所使用的字符集。request-body的编码过程由客户端浏览器自动完成,不需要额外的编程处理。
服务器的处理
相对于用户端,服务器端在接收到HTTP请求时提供了两种处理请求数据的方式:自动处理与不处理。
服务器一般会自动处理application/x-www-form-urlencoded类型的数据(包括request-line及request-body中的数据),就servlet(Servlet类或JSP网页)而言,可以通过request对象的getParameter()或getParameterValues()取得这些数据。对于除此以外的其它MIME类型的数据,HTTP服务器则是将处理的过程直接交到了与HTTP请求相对应的servlet(Servlet类或JSP网页)身上。
例如用户端有以下表单被提交:
[xhtml]view plain
表单提交时经服务器端自动处理后与checkUser.html相对应的servlet(Servlet类或JSP网页)可以通过下面的方式取得数据:
[java]view plain
默认情况下,服务器对于接收到的application/x-www-form-urlencoded类型数据进行字符集为ISO-8859-1的URLDecoding处理,经过处理之后的字符串内码为ISO-8859-1。对于没有附加任何设置的HTTP服务器而言,我们的servlet在取得数据之后必须进行相应的解码处理,生成内码为UTF-16(unicode)的字符串。
例如对于用户端请求数据中以UTF-8字符集进行URLEncoding的数据,servlet需要进行如下方式的解码:
[java]view plain
为了避免这种额外的编码/解码处理,也就是说让服务器了解到用户端在URLEncoding时所使用的字符集,从而直接进行相应字符集的URLDecoding处理,不同的HTTP服务器提供了不同的解决方案。
以Tomcat为例,Tomcat自动解码request-line的处理方式由Tomcat的配置文件server.xml指定。在server.xml中的Connector标签中提供了URIEncoding标签属性,只要为其指定解码用的字符集,Tomcat就会自动解码request-line中经过application/x-www-form-urlencoded编码处理的数据。例如:
<Connector connectionTimeout="40000" port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8" redirectPort="8443"/>
Tomcat自动解码request-body的处理方式是设置request的characterEncoding值。如:
request.setCharacterEncoding("UTF-8");
但是这一操作必须提前在filter中完成,在servlet中使用此方法已经不起作用了。filter的例子如下:
[java]view plain
我们可以在web.xml使用这个filter。web.xml的相应配置如下:
[xhtml]view plain
通过上述两种方式的预处理,在servlet中取出的数据可以不必进行ISO-8859-1解码而直接使用。
字符集的选择
在处理application/x-www-form-urlencoded类型的数据过程中,需要注意的另一个问题是字符集的选择问题。如上所述,不论是request-line还是request-body,其URLEncoding所使用的字符集都是当前网页在浏览器上显示时所使用的字符集。而这个信息又是HTTP服务器端生成HTML网页时,在HTTP响应中提供的。
当HTTP服务器接收到一个HTTP请求时,服务器总是需要向用户端发送一个HTTP响应。HTTP响应数据与HTTP请求数据格式相同,同样由以下几个部分组成:
<response-line>
<headers>
<CRLF>
[<response-body><CRLF>]
下面描述的是请求一个HTML网页数据时服务器的响应信息:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Length: 265
Date: Thu, 17 Dec 2009 05:20:36 GMT
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>test</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
[End]
其中headers的Content-Type指定了数据流的数据格式以及显示用的字符集。这一指标可以通过以下几种方式指定:
1. HTML网页
在HTML网页的<head></head>中存在多个<meta/>标签,其中可以设置Content-Type。例如:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
2. JSP网页
JSP网页中,除了<meta/>标签之外,还需要在JSP网页头部设置如下代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
3. Servlet类
如果要在Servlet类中通过response向用户端传送HTML数据,需要在传送前指定Content-Type。代码如下:
response.setContentType("text/html;charset=UTF-8");
通过上述三种方式,可以确保响应数据传送到用户端浏览器时,浏览器使用正确解码方式和字符集显示其内容。
结束语
总之,Content-Type是联系用户端与服务器端的纽带,通过这一指标,双方得以对相关的数据进行正确的编码与解码。只要了解了Content-Type的作用以及使用方法,乱码问题就会迎刃而解。
10. java数据库中文乱码怎么解决
原因1:mysql数据库中的数据本身就是乱码
解决方案:
设置mysql编码格式
<1>
停掉mysql服务
net
stop
mysql
<2>查询mysql编码格式
mysql>
show
variables
like
'character_set_%';
<3>默认就是瑞典latin1,换成自己的编码,如utf8【gbk】
mysql>set
names
'utf8';
【一般在访问之前执行这个代码就解决问题了】
【它相当于下面的三句指令:】
【set
character_set_client
=
utf8;】
【set
character_set_results
=
utf8;】
【set
character_set_connection
=
utf8;】
<3>
启动mysql服务
net
start
mysql
<4>
验证编码是否正确修改
mysql>
show
variables
like
'character_set_%';