`
Xiaor
  • 浏览: 54550 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

中文乱码总结

阅读更多
1、项目中乱码的根源
(1). 开发者所用的操作系统
(2). j2ee容器的名称,版本
(3). 数据库的名称,版本(精确版本)以及jdbc驱动的版本
(4). 出现乱码的source code(比如是system out出来的,还是jsp页面中的)

2.下面介绍一下直接在console上运行的类,jsp代码类和servlets类编码转换的详细过程。
(1)程序文件在保存时默认采用了操作系统默认支持的GBK编码形成了一个java文件。要查看file.encoding参数,可以用以下代码:
public class ShowSystemDefaultEncoding{
   public static void main(String[] args){
      String encoding = System.getProperty("file.encoding");
      System.out.println(encoding);
   }
}
(2)用JDK编译java源文件。若没用-encoding指定源程序的编码格式,JDK就获取操作系统的file.encoding参数,JDK就把java源文件从file.encoding编码格式转化为java内部默认的UNICODE格式放入内存中,然后javac把转化后的unicode格式的文件进行编
译成.class文件,此时是Unicode编码。
这一步,jsp过程是这样的,WEB容器调用JSP编译器,JSP编译器先查看JSP文件中是否
设置有文件编码格式,如果JSP文件中没有设置JSP文件的编码格式,则JSP编译器调用
JDK先把JSP文件用JVM默认的的字符编码格式(即WEB容器所在的操作系统的默认的
file.encoding)转化为临时的Servlet类,然后把它编译成Unicode格式的class类,并
保存在临时文件夹中。
(3)这一步分三种情况介绍
①直接在console上运行的类
JVM运行Unicode格式的class类,如果此时此类需要接收用户输入,则类会默认用
file.encoding编码格式对用户输入的串进行编码并转化为unicode保存入内存。程序
运行后,产生的Unicode编码的字符串再交给JVM,然后JRE把此字符串转化为
file.encoding格式显示。
②JSP代码和Servlet类
内存中是以Unicode编码的Servlet类的代码,然后JVM在内存中运行该Servlet类,如
果Servlet在运行的过程中需要接受从客户端传来的字符(表单传入的值和URL中传入的
值),此时如果程序中没有设定接受参数时采用的编码格式,则WEB容器会默认采用
ISO-8859-1编码来接受参数并在JVM中转化为Unicode格式存放在WEB容器的内存中。
Servlet运行后生成Unicode格式的输出,容器将输出直接发送到客户端浏览器上并输
出给用户,如果此时指定发送时输出的编码格式,则按指定的编码格式输出到浏览器
上,如果没有指定则默认按ISO-8859-1编码发送到客户的浏览器上。
③Java程序和数据库之间
程序在向数据库内存储包含中文的数据时,JDBC首先把程序内部的Unicode编码格式转
化为ISO-8859-1保存,然后传递到数据库中,在数据库中以ISO-8859-1保存数据。
3. 常见的java中文问题几个必须清楚的原则
任何Java程序的生命周期中,编码转换的关键过程在于:最初编译成class文件的转码
和最终向用户输出的转码过程。
(1)在编译时,如果源程序中含有中文字符,用-encoding指定源文件的编码方式为GBK
或者gb2312。
(2)几乎所有的WEB容器在其内部默认的字符编码格式都是ISO-8859-1。
(3)几乎所有的浏览器在传递参数时都是默认为UTF-8。
4.解决中文问题的几点建议
具体的思路是:在java程序转码的入口和出口及java程序同用户有输入输出转换的地
方限制编码方法。
(1)直接在console上运行的类
如果需要从用户端接受用户可能含有中文的输入或含有中文的输出,程序中应该采用
字符流来处理输入输出。
BufferedReader brin=new BufferedReader(System.in,"gb2312");
BufferedWriter brout=new BufferedWriter(System.out,"gb2312");
同时在编译程序时:javac -encoding gb2312 hello.java
(2)Servlet类
在编译Servlet类的源程序时,用-encoding指定编码为GBK或GB2312,且在向用户输出
时的编码部分用response对象的setContentType("text/html;charset=GBK"),在接受
用户输入时,用request.setCharacterEncoding("GB2312")。
(3)java程序和数据库之间
①java程序按上述方法处理
②把数据库默认支持的编码格式改为GBK或者GB2312。对于Mysql,在配置文件my.ini
中,在[mysqld]区增加default-character-set=gbk,并增加[client] default-
character-set=gbk.
(4) jsp页面
①保证JSP向客户端输出时是采用中文编码方式输出,在jsp源代码加入:
<%@page contentType="text/html;charset=gb2312"%>
②保证JSP能正确获得传入的参数,在jsp源文件头加入:
<%request.setCharacterEncoding("GB2312");%>
③为了让JSP编译器能正确地解码含有中文字符的JSP文件,在JSP源文件中指定源文件
的编码格式,加入:
<%@page pageEncoding="GB2312"%>或者<%@page pageEncoding="GBK"%>
5.开发中遇到的中文乱码实例
(1)通过url或者form表单提交向Action传递参数时出现乱码,解决方案:在java中采
用Expressions调试,使用new String(str.getBytes("ISO-8859-1"),"GBK")确认哪种编码可以正确获得中文。
(2)JSP页面间通过url传参数时出现乱码,在传递参数页面对参数param进行编码,如
下:
do.action?param=<%=java.net.URLEncoder.encode(param)%>
在接受参数页面对参数进行重新编码,如下:
param = new String(request.getParameter("param").getBytes("ISO-8859-1"));


小注:(1)Unicode中的符号是单字节宽的,汉字中的符号是双字节宽的。
(2)mysql的默认编码是ISO-8859-1;java中的默认编码也是ISO-8859-1;中文Windows默
认采用的是GBK;JSP文件是由容器调用JDK来编译的。
(3)<%@ page  contentType="text/html;charset=GB2312" %>的作用是在jsp被编译成为html的过程中提供编码方式让java来读取表达式当中的String;而<META http-
equiv=Content-Type content="text/html;charset=gb2312">是为IE浏览器提供编码选择,是用来显示最后的数据的。
(4)面对众多的编码有一个公共的符号编码,当gb2312符号中的一些符号映射到公共符
号编码,或者公共符号映射到gb2312时,如果找不到对应的编码就会出现乱码。
0
1
分享到:
评论

相关推荐

    中文乱码总结出现的原因,及解决方法,包括数据库乱码

    中文乱码总结出现的原因及解决方法,包括数据库乱码 中文乱码是一个常见的问题,它可能出现在 Java 和 JSP 文件中,也可能出现在 Java 程序与其他媒介交互时。以下是中文乱码的原因和解决方法: Java 和 JSP 文件...

    Qt+Visualstudio的中文乱码总结

    Qt+Visualstudio的中文乱码总结: 1、Qt4.7+VS2008,通过如下方法: .... 2、Qt5.2+VS2010 打入补丁 VS2010sp1,.... 3、 Qt5.2+ VS2012 不支持 #pragma execution_character_set ("utf-8") .... 4、Qt5.2+VS2013 ...

    jsp中文乱码总结包括 ajax中文乱码

    针对java web开发方面中文乱码情况的总结,基本各种情况都有了!

    AJAX中文乱码总结

    中文乱码问题在AJAX应用中时有出现,主要表现为从服务器获取的数据在前端显示时出现乱码。本篇文章将对AJAX中文乱码问题进行深入探讨,并提供解决策略。 1. 乱码产生的原因 - 数据编码不一致:服务器返回的数据...

    中文乱码问题分析 自己总结的

    中文乱码问题分析 中文乱码问题是 Java 和 JSP 开发中的一种常见问题,主要是由于 Java 和 JSP 源文件的保存方式是基于字节流的,而编译成 class 文件过程中,使用的编码方式与源文件的编码不一致所致。在 Java ...

    中文乱码处理问题总结

    ### 中文乱码处理问题总结 #### 一、引言 在进行中文字符处理时,经常会出现乱码问题。这主要是因为不同的系统、程序或组件可能采用不同的编码方式,而这些编码方式之间的转换不当就会导致乱码现象。本文将重点...

    java中常见的中文乱码总结

    Java 中文乱码总结 Java 中文乱码是指在 Java 应用程序中出现的中文字符显示不正确的问题。这种问题的出现是由于编码方式的不同引起的。下面我们将详细介绍 Java 中文乱码的原因、解决方法和防止乱码的技巧。 一、...

    Lua文件反编译汉字乱码处理

    总结来说,解决Lua文件反编译后汉字乱码问题,关键在于识别和处理正确的字符编码。通过检查和配置反编译工具、转换文件编码、自定义解码算法以及调整开发环境设置,都可以有效地应对这一挑战。对于开发者来说,理解...

    在eclipse中中文汉字乱码的解决方案

    Eclipse 中中文汉字乱码的解决方案 Eclipse 是一个功能强大且广泛使用的集成开发环境(IDE),但是在使用过程中,用户可能会遇到中文汉字乱码的问题。本文将为大家分享解决 Eclipse 中中文汉字乱码的方案,以便大家...

    struts处理中文乱码问题总结

    struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结

    express中文乱码解决

    ### Express 中文乱码解决方法 在Web开发中,尤其是使用Node.js的Express框架进行后端开发时,处理中文字符可能会遇到乱码问题。这通常是因为客户端与服务器之间的编码设置不一致导致的。本文将详细介绍如何在...

    keepass2在Ubuntu 15.10下中文乱码的解决办法.docx

    Keepass2 在 Ubuntu 15.10 下中文乱码的解决办法 Keepass2 是一个流行的密码管理器,但是在 Ubuntu 15.10 下可能会出现中文乱码的问题。本文将详细介绍 Keepass2 在 Ubuntu 15.10 下中文乱码的解决办法。 问题描述...

    C# 将中文乱码转换成中文

    本文将深入探讨如何使用C#语言解决中文乱码问题,将乱码文本正确转换为可读的中文。 ### 核心知识点:字符编码与转换 #### 1. 字符编码概念 字符编码是计算机用于存储、传输和显示文字的一套规则,它将字符映射到...

    【经验总结】解决 BurpSuite Pro v2020.1 版本中文乱码问题

    之前在我的公众号分享了 BurpSuite Pro v2020.1 版本,但是在使用过程中发现总是会有中文乱码的情况出现。 后来使用 Lucida 字体,乱码的情况得到了缓解,但是有些网页依旧会出现乱码的情况,直到后来才意识到问题...

    JSP中文乱码问题解决总结

    在IT行业中,尤其是在Web开发领域,JSP(JavaServer Pages)是常见的动态网页技术,而中文乱码问题一直是开发者们经常遇到的困扰。本篇文章将深入探讨JSP中文乱码问题的原因、解决策略以及预防措施。 一、乱码产生...

    Drozer中文乱码解决办法.docx

    Drozer 中文乱码解决办法 Drozer 是一款功能强大的 Android 渗透测试工具,但是在使用时,可能会遇到中文乱码的问题。今天,我们将探讨 Drozer 中文乱码解决办法。 一、问题描述 在使用 Drozer 时,可能会遇到...

    securecrt中文乱码解决

    ### SecureCRT中文乱码解决方案 SecureCRT是一款非常流行的终端仿真软件,被广泛应用于远程服务器管理。在使用过程中,用户可能会遇到中文显示乱码的问题。本文将详细介绍如何解决SecureCRT中的中文乱码问题。 ###...

    VSCode中文乱码解决方案总结(全)

    初学python,深受中文乱码之害。总结了自己遇到的所有的中文乱码解决方法。写的简略,但是好使。对乱码原因做了解释,其实还是对编码不够懂,如果你懂了原理,就能自己解决了。我的环境是VSCode + Anaconda2

Global site tag (gtag.js) - Google Analytics