3 Java语言中产生乱码的原因及解决方法
3.1基于awt(swing)的图形界面程序中文显示乱码
基 于awt(swing)的图形界面程序中,一般会出现菜单中的中文显示乱码,其原因一般是JVM找不到用来显示中文的字库,JVM在原始的安装下是没有中 文字库的,而linux的发行版本又各不相同,其字库存放的路径和名字又各不相同,所以JVM一般是找不到linux操作系统内带的字库,解决方法是让 JVM能找到linux操作系统内带的字库,如在Redflag 6.0下可以通过下面命令解决:
mkdir /usr/java/jdk1.6.0/jre/lib/fonts/fallback
ln -s /usr/share/fonts/chinese/TrueType/*.ttf /usr/java/jdk1.6.0/jre/lib/fonts/fallback
一般不需要修改JRE/lib/目录下的字体配置文件(fontconfig.OS.Version.properties)。
3.2 基于B/S结构的JSP(Servlet)的系统用户端浏览器中文显示乱码
3.2.1页面中的中文显示乱码
对于像HTML的静态文件,其文件的字符集只要和文件中<meta http-equiv="Content-Type" content="text/html; charset=…… ">处所设置的一样即可。
对 于像JSP和Servlet动态文件由于需要经过编译,在运行是由JVM解释class文件而产生用户端浏览器所需的HTML文件,如果产生中文乱码,则 一般是由编译和运行过程中产生的。如果用商用的发行版Linux和服务器,一般只要将JSP或Servlet文件保存为UTF-8字符集, 将<meta http-equiv = "Content-Type" content="text/html; charset=…… ">中设置为UTF-8即可。如果还出现乱码则可以通过以下方法解决:
①如果服务器是自主研发的,可以通过修改源代码,指定 JVM读文件、写文件以及生成用户端浏览器所需的HTML文件时,字符串与二进制序列流转换时的编码方式,从而从根本上解决问题,增强服务器的适应性,在 MyWebServer 2.0中,我就采用了这种方法,代码如下:
new BufferedReader(new InputStreamReader(new FileInputStream(jspfile),"GBK"));
new PrintWriter(serfile,"GBK");
new PrintWriter(new OutputStreamWriter(os,"GBK"));
②当然也可以在服务器的入口文件(即含有main子函数的文件)中修改JVM的“locale”设置,代码如下:
Locale.setDefault(new Locale(“zh”,”CN”));
③当采用商用服务器时,可以修改启动服务器的shell文件,在启动服务器前设置环境变量“export LC_ALL=zh_CN.UTF-8”,从而改变本控制台下默认的“locale”值。
④当然也可以修改操作系统的“locale”设置,但由于修改操作系统的“locale”设置将会影响到其他应用程序,所以一般采用该方法。
采 用上述方法的主要原因是,当JVM在首次起动时,将会把操作系统的“locale”设置为JVM的默认“locale”,在操作系统没有设置 “locale”值时(如mylinux 1.0),JVM将会把JVM的缺省的“locale”设置为JVM的默认“locale”,当然也可以在运行应用程序时修改JVM的默认 “locale”设置,在JVM进行字符串与二进制序列流相互转换时,如果指定了编码方式,将以指定的编码方式转换,否则根据JVM的默认 “locale”进行转换。
3.2.2 get方法从URL获取的参数中中文显示乱码
对于get方法来说,都是把数据串联在请求的url后面作为参数,url拼接完成后,浏览器会对url进行URL encode,然后发送给服务器,URL encode的过程就是把部分的url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的 字符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式。了解了URL encode的过程,我们能看到2个很重要的问题,第一:需要URL encode的字符一般都是非ASCII的字符,所以都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成 的;第二:URL encode到底按照那种编码方式对字符编码?不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8, 完成了URL encode的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。
服 务器端获取到数据,第一步是先把数据用iso-8859-1进行解码,对于get方法来说,tomcat获取数据的是ASCII范围内的请求头字符,其中 的请求url里面带有参数数据,如果参数中有中文等特殊字符,那么目前还是URL encode后的%XY状态,先停下,我们先说下开发人员一般获取数据的过程。通常大家都是request.getParameter("name")获 取参数数据,我们在request对象或得的数据都是经过解码过的,而解码过程中程序里是无法指定,服务器tomcat默认缺省用的是iso- 8859-1,这样我们就能找到为什么get请求带中文参数为什么在服务器端得到乱码了,原因是在客户端一般都是用UTF-8或GBK对数据URL encode,这里用iso-8859-1方式URL decoder显然不行,所以一般可以采用以下代码解决:
String Sname = new String(request.getParameter("name").getBytes("iso-8859-1"),"GBK");
//其中的“GBK”为用户端用浏览器URL编码方式。
也可以修改服务器的配置文件,让服务器在获取数据后用指定的方式进行URL decoder。
如 果服务器是自主研发的,可以通过修改服务器的源代码,指定URL的解编码方式,从而解决问题。如在myWebServer2.0中,我采用了在程序中直接 指定以"iso-8859-1"字符集组装二进制序列流,用“GBK“进行URL的解编码,从而可以使在众多的微软中文IE浏览器下JSP可以直接接收到 正确的中文参数。相关代码如下:
InputStreamReader myISR=new InputStreamReader(in,"iso-8859-1");
temp=URLDecoder.decode(temp,"GBK");
然 而在做开发时,不可能要求用户端用浏览器都用同样的方式进行URL编码,为了服务器能正确接收所有的用户的URL中的中文参数,通常可以通过用 JavaScript角本语言先将参数进行编码,编码后参数中的中文将会转换为”ACSII”码,然后再拼装到URL的后面提交,这时在服务器端就可以用 统一的方式从request中取到URL,然后再取出URL的参数进行解码。
3.2.3 post方法提交的中文参数出现乱码
在 post方法里所要传送的数据也要URL编码,在form所在的html文件里如果有段<meta http-equiv="Content-Type" content="text/html; charset=gb2312 "/>,那么post就会用此处指定的编码方式编码。一般大家都认为这段代码是为了让浏览器知道用什么字符集来对网页解释,其实它还有个作用就是指 定form表单的post方法提交数据的URL encode编码方式。对于get方法来数,浏览器对数据的URL encode的编码方式是有浏览器设置来决定,而post方法,开发人员可以指定。如果用tomcat默认缺省设置,也没做过滤器等编码设置,那么他也是 用“iso-8859-1”解码的,也可以通过在JSP中设置request.setCharacterEncoding("…")这时服务器会以JSP 中指定的字符集解码。
4 结论
Java语言在linux下中文显示产生的乱码,主要与JVM的字库、操作系统的 locale设置、JVM的默认locale设置、应用程序中的locale设置以及应用程序中直接指定的二进制序列流与字符串转化的字符集有关。是由于 二进制序列流和字符串相互转化过程中所采用的字符编码方式不同或者JVM找不到所需要的字库所致,可以采取不同的方法去解决,具体采用哪种方法处理还要结 合具体的应用环境。
- 浏览: 57014 次
相关推荐
本篇将详细讲解如何处理中文乱码问题,特别是在HTTP的GET和POST请求中。参考文档来源于CSDN博主的文章,我们将围绕这个主题进行深入探讨。 首先,我们需要理解中文乱码问题产生的原因。当HTTP请求发送含有中文字符...
Java中的乱码问题是一个常见的编程挑战,特别是在处理网络请求(如GET和POST)时。本文将深入探讨如何解决这些问题,并且不局限于特定的请求类型。首先,我们需要理解字符编码的基本概念,然后分析Java中可能出现...
总之,解决Java中的URL中文乱码问题需要理解URL编码的原理,并在客户端和服务器端采取相应的措施,确保编码和解码的一致性。无论是通过JavaScript编码、Java服务器端解码,还是调整服务器配置,关键在于确保字符集的...
本文将详细阐述GET和POST请求中文乱码的处理方式,以帮助开发者解决这类问题。 首先,我们需要了解为什么会出现中文乱码。在HTTP请求中,数据通常是按照ASCII编码进行传输的,而中文字符通常使用UTF-8或其他多字节...
JAVA 中文乱码问题是开发过程中常见的问题之一,解决这个问题需要了解乱码产生的原因,然后对症下药。下面我们对容易产生乱码问题的场景进行分析,并提出解决方案。 1. 以 POST 方法提交的表单数据中有中文字符 在...
在 Web 开发中,POST 和 GET 请求可能会出现乱码问题,导致中文参数无法正确传输和解析。今天,我们将讨论如何解决 POST 和 GET 请求乱码问题。 解决 POST 请求乱码问题 在 Spring 框架中,我们可以使用 ...
以下将详细解释如何解决Java中处理POST和GET请求时的中文乱码问题。 **POST请求的处理** 1. **表单页面设置**:在HTML表单所在的页面头部,使用`<meta>`标签指定页面的字符集,例如`;charset=utf-8">`。这使得...
在Java进行HTTP请求时,通常会遇到数据传输出现乱码的问题,尤其是在使用JSON格式传输数据,且数据中包含中文字符时更为常见。...此外,文中示例代码和方法对于Java开发者解决类似问题具有较高的参考价值。
摘要:本文将对 Java Web 中 Request 对象中 GET 和 POST 方法的差异进行分析和比较,通过代码示例和输出结果,展示 GET 和 POST 方法的不同之处,并分析其优缺点。 GET 方法和 POST 方法都是服务器的请求方式,...
通过以上方法,我们可以有效地解决POST和GET请求中的乱码问题。确保在客户端、服务器端以及数据存储环节都保持字符编码的一致性,是防止乱码的关键。在实际开发中,一定要养成良好的编码习惯,正确地处理字符集转换...
在IT行业中,网络通信是不可或缺的一部分,而URL编码、GET和POST提交以及乱码问题则是开发者经常遇到的技术挑战。本文将深入探讨这些知识点,并提供相应的解决方案。 首先,URL编码是因URL(统一资源定位符)中不能...
解决方法:解决中文乱码问题的方法有两种,一种是使用POST方式,另一种是使用GET方式。 1、POST方式:在POST方式中,我们可以使用request.setCharacterEncoding("UTF-8")来指定解码方式为UTF-8。这将使服务器使用...
### POST和GET方法乱码解决方案 #### 前言 在Web开发中,中文乱码问题经常出现。这种现象主要是由于客户端(浏览器)与服务器之间的编码...通过以上方法,可以有效地解决Web开发中常见的POST和GET方法中文乱码问题。
以下是一些解决Java POST与GET数据传递时中文乱码问题的方法。 1. **POST数据传递**: 在接收POST数据的JSP页面中,我们需要确保两个关键点: - **声明页面字符集**:`<%@ page pageEncoding="UTF-8"%>` 这行...
主要解决表单提交中文乱码问题,主要针对页面GET提交的处理编码问题,设计知识 过滤器,servlet,装饰设计模式等
get post提交表单中文乱码过滤器(java)
本篇文章将详细介绍在Java Web开发中解决乱码问题的方法。 #### 二、乱码产生的原因 乱码主要由以下几种情况引起: 1. **页面本身的编码与浏览器解析编码不一致**:例如页面实际编码为GBK,但浏览器默认按照ISO-...
然而,在处理中文参数时,尤其是通过GET和POST方法传递时,经常会出现乱码问题。这通常是由于字符编码不一致或者处理不当导致的。以下是对这一问题的详细解析: 首先,我们需要理解字符编码的基本概念。在Web中,...
### Java乱码问题详解与解决方案 #### 一、问题背景 在Java开发过程中,尤其是在处理中文字符时,经常遇到字符编码不一致导致的乱码问题。由于Java默认使用Unicode编码,而在中国大陆地区,常见的字符集为GB2312...
总结,解决Spring MVC中GET请求中文乱码问题的关键在于确保从客户端到服务器再到客户端的整个链路中,字符编码的一致性和正确设置。通过调整配置、使用注解或自定义拦截器,可以有效地解决这个问题,确保中文数据的...