Java/JSP中文乱码问题解决

java_jsp乱码(全) ① 首选先认识一下编码的格式 GB2312简体中文 utf-8国际编码iso-8859-1美国用的编码(tomcat中传输用的编码) GBK是GB2312的扩展都是简体中文② 接着我们举例子1 来说明乱码问题 1 页面 formpost.jsp 是提交数据的页面 中文问题 阅读详情

Java/JSP中文乱码问题解决

自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。

一、Java中文问题的由来

Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。

首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系),如果必须写的话,尽量手动带参数-ecoding GBK或-ecoding gb2312编译;对于JSP,在文件头加上<%@ page contentType="text/html;charset=GBK"%>或<%@ page contentType="text/html;charset=gb2312"%>基本上就能解决这类乱码问题。

本文要重点讨论的是第二类乱码,即Java程序与其他存储媒介交互时产生的乱码。很多存储媒介,如数据库,文件,流等的存储方式都是基于字节流的,Java程序与这些媒介交互时就会发生字符(char)与字节(byte)之间的转换,具体情况如下:

从页面form提交数据到java程序 byte->char
从java程序到页面显示 char—>byte

从数据库到java程序 byte—>char
从java程序到数据库 char—>byte

从文件到java程序 byte->char
从java程序到文件 char->byte

从流到java程序 byte->char
从java程序到流 char->byte

如果在以上转换过程中使用的编码方式与字节原有的编码不一致,很可能就会出现乱码。

二、解决方法

前面已经提到了Java程序与其他媒介交互时字符和字节的转换过程,如果这些转换过程中容易产生乱码。解决这些乱码问题的关键在于确保转换时使用的编码方式与字节原有的编码方式保持一致,下面分别论述(Java或JSP自身产生的乱码请参看第一部分)。

1、JSP与页面参数之间的乱码
JSP获取页面参数时一般采用系统默认的编码方式,如果页面参数的编码类型和系统默认的编码类型不一致,很可能就会出现乱码。解决这类乱码问题的基本方法是在页面获取参数之前,强制指定request获取参数的编码方式:request.setCharacterEncoding("GBK")或request.setCharacterEncoding("gb2312")。有些JSP服务器如WEBSPHERE会自动转码,有些JSP服务器如tomcat还可以通过配置过滤器的方式来解决:
<web-app>
<filter>
<filter-name>RequestFilter</filter-name>
<filter-class>net.golden.uirs.util.RequestFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>RequestFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</web-app>

如果在JSP将变量输出到页面时出现了乱码,可以通过设置response.setContentType("text/html;charset=GBK")或response.setContentType("text/html;charset=gb2312")解决。

2、Java与数据库之间的乱码
大部分数据库都支持以unicode编码方式,所以解决Java与数据库之间的乱码问题比较明智的方式是直接使用unicode编码与数据库交互。很多数据库驱动自动支持unicode,如Microsoft的SQLServer驱动。其他大部分数据库驱动,可以在驱动的url参数中指定,如如mm的mysql驱动:jdbc:mysql://localhost/WEBCL2DB?useUnicode=true&characterEncoding=GBK。

3、Java与文件/流之间的乱码
Java读写文件最常用的类是FileInputStream/FileOutputStream和FileReader/FileWriter。其中FileInputStream和FileOutputStream是基于字节流的,常用于读写二进制文件。读写字符文件建议使用基于字符的FileReader和FileWriter,省去了字节与字符之间的转换。但这两个类的构造函数默认使用系统的编码方式,如果文件内容与系统编码方式不一致,可能会出现乱码。在这种情况下,建议使用FileReader和FileWriter的父类:InputStreamReader/OutputStreamWriter,它们也是基于字符的,但在构造函数中可以指定编码类型:InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。

4、其他
上面提到的方法应该能解决大部分乱码问题,如果在其他地方还出现乱码,可能需要手动修改代码。解决Java乱码问题的关键在于在字节与字符的转换过程中,你必须知道原来字节或转换后的字节的编码方式,转换时采用的编码必须与这个编码方式保持一致。我们以前使用Resin服务器,使用smartUpload组件上传文件,上传文件同时传递的中文参数获取没有乱码问题。当在Linux中把Resin设置成服务后,上传文件同时的中文参数获取出现了乱码。这个问题困扰了我们很久,后来我们分析smartUpload组件的源文件,因为文件上传采用的是字节流的方式,里面包含的参数名称和值也是字节流的方式传递的。smartUpload组件读取字节流后再将参数名称和值从字节流中解析出来,问题就出现在smartUpload将字节流转换成字符串时采用了系统默认的编码,而将Resin设置成服务后,系统默认的编码可能发生了改变,因此出现了乱码。后来,我们更改了smartUpload的源文件,增加了一个属性charset和setCharset(String)方法,将upload()方法中提取参数语句:
String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1 );
改成了
String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1, charset );
终于解决了这个乱码问题。

 

 

 

 

java读取txt文件.以及解决其乱码问题

java的io操作文件中数txt文件最简单了..
一般在读写时时候要注意乱码问题..这个问题数简单也不简单..
得从创建记事本开始说起.
   有两种创建方式:
      一、是程序创建:创建的时候回规定其编码方式
      二、是在桌面右键 新建 记事本。这时候一般我们都不会可以的去选择其编码方式
所以就会出现乱码的问题...

/*-------------------------------------------------------------------------*/
import java.io.*;
public class ReadWriteFile {

public static void main(String args[])
{
   try
   {
    File read=new File("E://test.txt");
    File write=new File("E://test1.txt");
    BufferedReader br=new BufferedReader(new FileReader(read));
    BufferedWriter bw=new BufferedWriter(new FileWriter(write));
    String temp=null;
    temp=br.readLine();
    while(temp!=null)
    {
     //System.out.println("写了一行");
     bw.write(temp+"/r/n");
     temp=br.readLine();
    }
    bw.close();
    br.close();
   }
   catch(FileNotFoundException e)
   {
    System.out.println("文件没有找到异常");
   }
   catch(IOException e)
   {
    System.out.println(e.getMessage());
   }
}
}

/*-------------------------------------------------------------------------*/
import java.io.*;
public class ReadWriteFile {

public static void main(String args[])
{
   try
   {
    File read=new File("E://test.txt");
    File write=new File("E://test1.txt");

    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(read), "GBK"));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(write), "GBK"));
    String temp=null;
    temp=br.readLine();
    while(temp!=null)
    {
     //System.out.println("写了一行");
     bw.write(temp+"/r/n");
     temp=br.readLine();
    }
    bw.close();
    br.close();
   }
   catch(FileNotFoundException e)
   {
    System.out.println("文件没有找到异常");
   }
   catch(IOException e)
   {
    System.out.println(e.getMessage());
   }
}
}

/*----------------------------------------------------------------------------*/
这样改 大功告成.......................

等时替代模型( Isotemporal Substitution Model) 文献阅读:Associations of sedentary time and physical activity with adverse health conditions: Outcome-wide analyses using isotemporal substitution model(该论文于2022年4月28日发表在柳叶刀子刊 EClinicalMedicine 上) 阅读详情

相关推荐

Unity 编辑器篇|(四)编辑器拓展GUI类 (全面总结 | 建议收藏)

GUI 类是 Unity GUI 的接口,并且具有手动定位功能。“即时模式”GUI 系统(也称为 IMGUI)是一个完全独立的功能系统,不同于 Unity 基于游戏对象的主 UI 系统。IMGUI 是一个代码驱动的 GUI 系统,主要用作程序员的工具。为了驱动该系统,需在实现脚本上调用 OnGUI 函数即时模式 GUI 系统常用于:创建游戏内调试显示和工具。为脚本组件创建自定义检视面板。创建新的编辑器窗口和工具以扩展 Unity 本身。

游戏开发小Y的博客 12万+

中文输出出现乱码

 对于此种情况,使用下面这个方法,进行转变即可public String toChinese(String ss) {    try{       String temp_p=ss;       byte[] temp_t=temp_p.getBytes("ISO8859-1");       ss=new String(temp_t);       }catch(Exception e){ 

loaferwang的专栏 902

自制抓娃娃机原理图及程序

基于Arduino Mega 2560的自制抓娃娃机,机器的“大脑”是 arduino MEGA 2560,因为它有足够的输入/输出用于所有电机等。

java中的中文乱码问题解决

enctype="multipart/form-data" 表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作. enctype="multipart

ebonyzhang 1061

httpClient采集到的数据乱码问题完整解决

解决乱码有如下几种方式,还有两种特殊的情况:

直到世界的尽头 1万+

Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别

一、概述 在java异常体系中,要打印异常信息,可以通过:e.getMessage() 、 e.toString() e.printStackTrace() 等方法打印出 一些 异常信息。已知的是这些方法都可以打印异常信息,但是这些方法打印的异常信息 都不相同,那么问题来啦: 这些方法打印异常信息的区别是?日常开发工作中,该用哪个方法打印异常信息呢?二、代码理解 1、 Junit 单元测试 --- 模拟异常信息输出 1.1、输出结果如下:

HaHa_Sir的博客 1万+

解决JSP中文乱码问题

JSP中处理中文乱码问题,通常涉及到字符编码的设置。有几种常见的方法。

2301_82090006的博客 1864

Java/JSP中文乱码问题解决心得

Java/JSP中文乱码问题解决心得作者信息:liqian  liqianbnu@126.com   http://blog.vschool.net.cn/liqian/文章原始出处:http://blog.vschool.net.cn/liqian/000271.html自从接触JavaJSP以来,就不断与Java中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的

xxxuehao的专栏 1870

Java/JSP中文乱码问题解决心得(转)

自从接触JavaJSP以来,就不断与Java中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。   一、Java中文问题的由来   Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,JavaJSP文件本身编译时产生的乱码问题Java程序于其他媒介交互产生的乱码问题。   首

辉蛋儿的学习历程 631

Java/JSP中文乱码问题解决心得

自从接触JavaJSP以来,就不断与Java中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。一、Java中文问题的由来 Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,JavaJSP文件本身编译时产生的乱码问题Java程序于其他媒介交互产生的乱码问题。首先Java(包括

haotij的专栏 395

java jsp中文乱码怎么解决_JSP中文乱码问题解决方案

Java开发中,中文乱码是一个让人头疼的问题,针对不同情况下乱码的处理方法又各不相同,这导致许多初学者对乱码问题束手无策。其实造成这种问题的根本原因是Java默认使用的编码方式是Unicode,对中文的编码方式一般情况是GB2312,因为编码格式的不同,导致中文不能正常显示。1. JSP页面中文乱码JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一种是在JSP中动态输出的...

weixin_39638105的博客 3336

java jsp中文乱码怎么解决_分享JSP中文乱码解决方法

一、JSP页面中文乱码JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一种是在JSP中动态输出的中文乱码。先看一个JSP程序:中文显示示例这是一个中文显示示例:String str = "中文";out.print(str);%>上面这个JSP程序看起来好像是在页面显示几句中文而且标题也是中文。运行后在浏览器中显示如图所示原因在于没有在JSP中指定页面显示的编码,消除乱...

weixin_39611722的博客 1641

Java JSP乱码(中文问题)解决大全

Java JSP乱码(中文问题)解决大全 1.问题的起源   每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的 ASCII,中国的 GB2312-80,日本的 JIS 等,作为该国家/区域内信息处理的基础,有着统一编码的重要作用。字符编码集按长度分为 SBCS(单字节字符集),DBCS(双字节字符集)两大类。早期的软件(尤其是操作系统),为了解决本地字符信息的计算机处理,出现...

xgbjmxn的专栏 467

springboot 添加拦截器之后中文乱码_springboot自定义拦截器实现异常的统一捕获和处理-Go语言中文社区...

前言每个方法中可能会抛出不同的异常,如果都是用try catch去处理,显得非常冗余,可以通过spring提供的@ExceptionHandler注解来实现异常的统一封装和处理拦截器的实现:@RestControllerAdvicepublic class CommonExceptionHandler {/*** 拦截Exception类的异常** @param e* @return*/@Exce...

weixin_39700548的博客 394

jsp传值到java出现乱码

new String(req.getParameter(“userName”).getBytes(“ISO8859-1”),“UTF-8”);

YongHu00001的博客 400
上一篇: Java多线程编程详解
下一篇: JAVA简单考试题
haobo920
博客等级 码龄16年 72粉丝 8原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值