CenturyMagus的专栏

www.err123.cn ,收集各类编程错误的解决方案,欢迎大家访问

用户操作
[即时聊天] [发私信] [加为好友]
magusID:CenturyMagus
65743次访问,排名1655,好友2人,关注者3人。
CenturyMagus的文章
原创 42 篇
翻译 1 篇
转载 40 篇
评论 23 篇
CenturyMagus的公告

ah011一起在友播听歌吧!
最近评论
zhengyuanting:通过URL传中文,如果不是post的话,是会乱码的
qq386232894:好文章!!!!
fz04003:谢谢啊,我终于搞懂这个东西了。
虽然我用的是JQuery,但是终于搞懂Struts这块是怎么回事了,谢谢!
小脚:终于全部搞懂了!!!谢谢老大~
小小鸟:好文章.比其他好多地方都讲的清楚透彻.赞一个.
文章分类
收藏
    相册
    编程网站
    Apache
    IBM DeveloperWorks
    onjava
    W3C
    编程错误解决方案收集
    计算机词汇在线词典
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 深入剖析Java编程中的中文问题及建议最优解决方法(2)收藏

    新一篇: 深入剖析Java编程中的中文问题及建议最优解决方法(1) | 旧一篇: Shell学习笔记

    4、中文问题的分类及其建议最优解决办法    

    了解以上JAVA处理文件的原理之后,我们就可以提出了一套建议最优的解决汉字问题的办法。     

    我们的目标是:我们在中文系统中编辑的含有中文字符串或进行中文处理的JAVA源程序经编译后可以移值到任何其它的操作系统中正确运行,或拿到其它操作系统中编译后能正确运行,能正确地传递中文和英文参数,能正确地和数据库交流中英文字符串。     我们的具体思路是:在JAVA程序转码的入口和出口及JAVA程序同用户有输入输出转换的地方限制编码方法使之正确即可。

       

    具体解决办法如下:    

    1 针对直接在console上运行的类    

    对于这种情况,我们建议在程序编写时,如果需要从用户端接收用户的可能含有中文的输入或含有中文的输出,程序中应该采用字符流来处理输入和输出,具体来说,应用以下面向字符型节点流类型:   

    对文件:FileReaderFileWrieter  字节型节点流类型为:FileInputStreamFileOutputStream    

    对内存(数组):CharArrayReaderCharArrayWriter  其字节型节点流类型为:ByteArrayInputStreamByteArrayOutputStream    

    对内存(字符串):StringReaderStringWriter    

    对管道:PipedReaderPipedWriter 其字节型节点流类型为:PipedInputStreamPipedOutputStream     


    同时,应该用以下面向字符型处理流来处理输入和输出:    

    BufferedWriterBufferedReader 其字节型的处理流为:BufferedInputeStreamBufferedOutputStream     InputStreamReaderOutputStreamWriter     


    其字节型的处理流为:DataInputStreamDataOutputStream 其中InputStreamReaderInputStreamWriter用于将字节流按照指定的字符编码集转换到字符流,如:     InputStreamReader in = new InputStreamReader(System.in"GB2312")     OutputStreamWriter out = new OutputStreamWriter (System.out"GB2312")    


    例如:采用如下的示例JAVA编码就达到了要求:

    //Read.java import java.io.*;
    
    public class Read {
    
        public static void main(String[] args) throws IOException
    
        {
    
            String str = " 中文测试,这是内部硬编码的串"+" test english character";         String strin= "";        
    
            //设置输入接口按中文编码
    
            BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in,"gb2312"));
    
            //设置输出接口按中文编码              BufferedWriter stdout = new BufferedWriter(new OutputStreamWriter(System.out,"gb2312"));          stdout.write("请输入:");
    
            stdout.flush();
    
            strin = stdin.readLine();
    
            stdout.write("这是从用户输入的串:"+strin);
    
            stdout.write(str);
    
            stdout.flush();
    
        }
    
    }   
    


    同时,在编译程序时,我们用以下方式来进行:    

    javac -encoding gb2312 Read.java     

    其运行结果如图5所示:

       


    2 针对EJB类和不可以直接运行的支持类(JavaBean)    

    由于这种类它们本身被其它的类调用,不直接与用户交互,故对这种类来说,我们的建议的处理方式是内部程序中应该采用字符流来处理程序内部的中文字符串(具体如上面一节中一样),同时,在编译类时用-encoding gb2312参数指示源文件是中文格式编码的即可。    


    3 针对Servlet     针对Servlet,我们建议用以下方法:    

    在编译Servlet类的源程序时,用-encoding指定编码为GBKGB2312,且在向用户输出时的编码部分用response对象的setContentType("text/html;charset=GBK");gb2312来设置输出编码格式,同样在接收用户输入时,我们用request.setCharacterEncoding("GB2312");这样无论我们的servlet类移植到什么操作系统中,只有客户端的浏览器支持中文显示,就可以正确显示。如下是一个正确的示例:

     

    点击查看原始尺寸

       

    其运行结果如图6所示:

     

       


    4 JAVA程序和数据库之间     

    为避免JAVA程序和数据库之间数据传递出现乱码现象,我们建议采用以下最优方法来处理:   

        1 对于JAVA程序的处理方法按我们指定的方法处理。    

        2 把数据库默认支持的编码格式改为GBKGB2312的。     

            如:在mysql中,我们可以在配置文件my.ini中加入以下语句实现:    

                [mysqld]区增加:default-character-set=gbk    

                并增加:[client] default-character-set=gbk    

    SQL Server2K中,我们可以将数据库默认的语言设置为Simplified Chinese来达到目的。    


    5 针对JSP代码     

    由于JSP是在运行时,由WEB容器进行动态编译的,如果我们没有指定JSP源文件的编码格式,则JSP编译器会获得服务器操作系统的file.encoding值来对JSP文件编译的,它在移植时最容易出问题,如在中文win2k中可以很好运行的jsp文件拿到英文linux中就不行,尽管客户端都是一样的,那是因为容器在编译JSP文件时获取的操作系统的编码不同造成的(在中文wink中的file.encoding和在英文Linuxfile.encoding是不同的,且英文Linuxfile.encoding对中文不支持,所以编译出来的JSP类就会有问题)。网络上讨论的大多数是此类问题,多是因为JSP文件移植平台时不能正确显示的问题,对于这类问题,我们了解了JAVA中程序编码转换的原理,解决起来就容易多了。我们建议的解决办法如下:    

        1、我们要保证JSP向客户端输出时是采用中文编码方式输出的,即无论如何我们首先在我们的JSP源代编中加入以下一行:         

        2、为了让JSP能正确获得传入的参数,我们在JSP源文件头加入下面一句:         

        3、为了让JSP编译器能正确地解码我们的含有中文字符的JSP文件,我们需要在JSP源文件中指定我们的JSP源文件的编码格式,具体来说,我们在JSP源文件头上加入下面的一句即可:     

        或这是JSP规范2.0新增加的指令。    


    我们建议使用此方法来解JSP文件中的中文问题,下面的代码是一个正确做法的JSP文件的测试程序: http://fafeng.blogbus.com/files/1155713396.png

        如图7是此程序运行的结果示意图:



    5、总结     在上面的详细分析中,我们清晰地给出了JAVA在处理源程序过程中的详细转换过程,为我们正确解决JAVA编程中的中文问题提供了基础。同时,我们给出了认为是最优的解决JAVA中文问题的办法。

    发表于 @ 2008年06月11日 11:07:00|评论(loading...)|编辑|收藏

    新一篇: 深入剖析Java编程中的中文问题及建议最优解决方法(1) | 旧一篇: Shell学习笔记

    评论

    #zhengyuanting 发表于2008-10-06 19:50:18  IP: 222.65.114.*
    通过URL传中文,如果不是post的话,是会乱码的
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © CenturyMagus