`

java中紊乱码问题

阅读更多
转的[color=blue][/color][size=x-small][/size][align=left][/align]
一、java中文问题的由来

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

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

本文要重点讨论的是第二类乱码,即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将变量输出到页面时出现了乱码,可以通过设置response.setcontenttype("text/html; charset=gbk")或response.setcontenttype("text/html;charset=gb2312")解决。

如果不想在每个文件里都写这样两句话,更简洁的办法是使用servlet规范中的过虑器指定编码,过滤器的在web.xml中的典型配置和主要代码如下:

web.xml:

characterencodingfilter

net.vschool.web.characterencodingfilter

encodinggbk

characterencodingfilter

/*

characterencodingfilter.java:

public class characterencodingfilter implements filter

{

protected string encoding = null;

public void init(filterconfig filterconfig) throws servletexception

{

this.encoding = filterconfig.getinitparameter("encoding");

}

public void dofilter(servletrequest request, servletresponse response, filterchain chain) throws ioexception, servletexception

{

request.setcharacterencoding(encoding);

response.setcontenttype("text/html;charset="+encoding);

chain.dofilter(request, response);

}

}

2、java与数据库之间的乱码

大部分数据库都支持以unicode编码方式,所以解决java与数据库之间的乱码问题比较明智的方式是直接使用unicode编码与数据库 交互。很多数据库驱动自动支持unicode,如microsoft的sqlserver驱动。其他大部分数据库驱动,可以在驱动的url参数中指定,如 如mm的mysql驱动:jdbc:mysql://localhost/webcldb?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 );

终于解决了这个乱码问题 
分享到:
评论

相关推荐

    论文研究 - 剧烈运动—肝脏酶紊乱的不寻常原因

    肝酶和功能测试通常在临床实践中进行。 但是,肝酶紊乱并不一定总是暗示潜在的肝脏病理。 测量的标准肝酶包括丙氨酸转氨酶(ALT),天冬氨酸转氨酶(AST),γ-谷氨酰转肽酶(GGT)和丙氨酸磷酸酶(ALP)。 这些酶,...

    青岗坪煤矿主井风流紊乱原因及防治措施

    为了解决青岗坪煤矿主井风流紊乱的问题,利用风压平衡定律对其通风系统进行分析,推导了风流紊乱的判别式;在通风阻力和自然风压测定的基础上,利用实测数据对判别式进行验证;结合判别式和现场实际情况,提出防治风流紊乱...

    数据挖掘探讨2型糖尿病合并脂代谢紊乱证治规律.pdf

    特别是在慢性疾病的研究中,如2型糖尿病合并脂代谢紊乱等复杂疾病的证治规律探讨,数据挖掘技术的应用尤为显著。本文将探讨使用数据挖掘技术,在结合中医理论和现代医学分析的基础上,对2型糖尿病合并脂代谢紊乱的证...

    复杂水、电解质紊乱治疗--讲课幻灯

    复杂水、电解质紊乱治疗的讲课幻灯片,共65张,医师必备基础

    日产尼桑防盗密码计算器

    3. 使用过程中可能需要一定的汽车电子知识,否则可能导致车辆功能紊乱。 在实际操作中,除了这个计算器,还有一些其他的方法来获取或重置防盗密码,比如通过车辆的仪表板上的隐藏按钮序列,或者通过联系日产的客户...

    请患“植物神经紊乱”和“焦虑症”的朋友进来.pdf

    根据文章中提到的症状,植物神经紊乱的症状包括睡眠困难、 Chest tightness、恐慌、轻生念头等。 二、焦虑症的定义和症状 焦虑症是一种常见的心理疾病,主要症状为过度的恐惧、担忧和焦虑,导致身心俱疲、睡眠困难...

    基于潜意识理论的心理紊乱发生机理及其验证

    张弛原理是指人的心理状态在张力和松弛之间进行切换的过程,这一过程在心理紊乱的发生机理中起到了关键作用。当一个人的睡眠严重缺失时,其意识功能会受到削弱,而潜意识则相对增强,这种失衡状态是心理紊乱发生的...

    《糖尿病脂代谢紊乱》PPT课件.ppt

    然而,糖尿病不仅仅是血糖控制的问题,它还与脂代谢紊乱密切相关,这进一步增加了患者患冠心病的风险。 脂代谢紊乱在糖尿病中扮演着重要角色,表现为血脂异常,包括胆固醇、甘油三酯和脂蛋白水平的改变。脂蛋白是...

    Java程序员面试笔试真题库_2017版_迷你书

    同时,本书对这些题目进行了庖丁解牛式的分析与讲解,针对试题中涉及的部分重难点问题,进行了适当地扩展与延伸,力求对知识点的讲解清晰而不紊乱,全面而不啰嗦,使读者能够通过本书不仅获取到求职的知识,同时更有...

    传感器输出信号紊乱检查方法.doc

    然而,在实际应用过程中,由于各种因素(如电磁干扰、环境变化等)的影响,传感器的输出信号可能会出现紊乱现象,进而导致系统控制精度下降或误动作等问题。因此,如何有效地检测并解决传感器输出信号紊乱问题成为了...

    滑膜与滑液改变在颞下颌关节紊乱病中的作用与意义

    他提出的滑膜及滑液改变在颞下颌关节紊乱病中的作用,为该领域研究开辟了新的视角,也为临床治疗颞下颌关节紊乱病提供了新的思路和方法。通过不断地科学研究和技术进步,未来有望开发出更有效的预防和治疗策略,以...

    hua-ya-du-xie-qi-.zip_satellite receiver_小锅数据紊乱

    标题中的“hua-ya-du-xie-qi-”可能是指一种特定的数据修复工具或软件,用于处理卫星接收器中的数据紊乱问题。这个软件主要用于解决"小锅数据紊乱"的情况,这意味着它可能适用于那些使用小型卫星天线(俗称“小锅”...

    Java面试宝典和大学生面试宝典

    在回答电话面试的问题时,不要过于紧张,要留心对方的问题,这 些问题也许在当面的面试中还会再出现。如果对方在电话面试中要求你 做英文的自我介绍,或者干脆用英文和你对话,那在电话面试结束后一 定要好好准备...

    半导体激光治疗颞下颌关节紊乱病383例临床分析.pdf

    这篇文献主要讨论了半导体激光在治疗颞下颌关节紊乱病中的应用,并通过对383例患者的临床分析,评估了该治疗方法的效果。颞下颌关节紊乱病是一种常见的口腔疾病,主要分为咀嚼肌紊乱疾病和关节结构紊乱疾病。文章中...

    热浪变形紊乱插件(heatdistortion)v1.0.31汉化破解安装版

    heat distortion是一款ak最新发布的ae插件,又叫做热浪变形紊乱插件,通过该插件可以简单快速的就能搞定波形紊乱效果。软件操作比较简单,支持模糊,扭曲,错乱,形态等属性操作,值得一提的是插件直接支持MASK操作...

    颞下颌关节紊乱病咬合治疗的研究进展

    正畸治疗不仅可以应用于儿童和青少年,还可以用于成人的咬合紊乱问题。 调磨牙齿是通过修整牙面形态,改变咬合关系,以达到缓解关节症状的目的。拔除第三磨牙则是考虑到智齿萌出可能对颞下颌关节产生影响,拔除智齿...

Global site tag (gtag.js) - Google Analytics