• 2008-09-29

    native2ascii 使用方法 及 Java字符编码

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://leenmax.blogbus.com/logs/29743111.html

    在做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,比如常见的validator验证用的消息资源(properties)文 件就需要进行Unicode重新编码。原因是java默认的编码方式为Unicode,而我们的计算机系统编码常常是GBK等编码。需要将系统的编码转换 为java正确识别的编码问题就解决了。

       native2ascii 是JDK自带的工具,在jdk\bin\文件夹下。将带有本机编码字符(非拉丁 1 和非单一码字符)的文件转换成带有Unicode编码字符的文件。有两种用法:  

    1.将 GB2312(中文) 转成 Unicode(Java文件):  

     cmd下  native2ascii -encoding gbk  gb2312.txt  unicode.txt

    2.将 Unicode(Java文件) 转成 GB2312(中文):

     cmd下  native2ascii -reverse -encoding gb2312  unicode.txt  gb2312.txt 

    详细内容可以参考http://java.sun.com/javase/6/docs/technotes/tools/windows/native2ascii.html 

    ---------------------------------------------------

     支持的编码有:

    -------------------------------------------------------------

    Converter        Description
    Class
    -------------------------------------------------------------

    8859_1           ISO 8859-1
    8859_2           ISO 8859-2
    8859_3           ISO 8859-3
    8859_4           ISO 8859-4
    8859_5           ISO 8859-5
    8859_6           ISO 8859-6
    8859_7           ISO 8859-7
    8859_8           ISO 8859-8
    8859_9           ISO 8859-9
    Big5                Big5, Traditional Chinese
    CNS11643       CNS 11643, Traditional Chinese
    Cp037             USA, Canada(Bilingual, French), Netherlands,Portugal, Brazil, Australia
    Cp1006           IBM AIX Pakistan (Urdu)
    Cp1025           IBM Multilingual Cyrillic: Bulgaria, Bosnia,Herzegovinia, Macedonia(FYR)Cp1026           IBM Latin-5, Turkey
    Cp1046           IBM Open Edition US EBCDIC
    Cp1097           IBM Iran(Farsi)/Persian
    Cp1098           IBM Iran(Farsi)/Persian (PC)
    Cp1112           IBM Latvia, Lithuania
    Cp1122           IBM Estonia
    Cp1123           IBM Ukraine
    Cp1124           IBM AIX Ukraine
    Cp1125           IBM Ukraine (PC)
    Cp1250           Windows Eastern European
    Cp1251           Windows Cyrillic
    Cp1252           Windows Latin-1
    Cp1253           Windows Greek
    Cp1254           Windows Turkish
    Cp1255           Windows Hebrew
    Cp1256           Windows Arabic
    Cp1257           Windows Baltic
    Cp1258           Windows Vietnamese
    Cp1381           IBM OS/2, DOS People's Republic of China (PRC)
    Cp1383           IBM AIX People's Republic of China (PRC)
    Cp273             IBM Austria, Germany
    Cp277             IBM Denmark, Norway
    Cp278             IBM Finland, Sweden
    Cp280             IBM Italy
    Cp284             IBM Catalan/Spain, Spanish Latin America
    Cp285             IBM United Kingdom, Ireland
    Cp297             IBM France
    Cp33722          IBM-eucJP - Japanese (superset of 5050)
    Cp420             IBM Arabic
    Cp424             IBM Hebrew
    Cp437             MS-DOS United States, Australia, New Zealand,
    South Africa                
    Cp500            EBCDIC 500V1
    Cp737            PC Greek
    Cp775            PC Baltic
    Cp838            IBM Thailand extended SBCS
    Cp850            MS-DOS Latin-1
    Cp852            MS-DOS Latin-2
    Cp855            IBM Cyrillic
    Cp857            IBM Turkish
    Cp860            MS-DOS Portuguese
    Cp861            MS-DOS Icelandic
    Cp862            PC Hebrew
    Cp863            MS-DOS Canadian French
    Cp864            PC Arabic
    Cp865            MS-DOS Nordic
    Cp866            MS-DOS Russian
    Cp868            MS-DOS Pakistan
    Cp869            IBM Modern Greek
    Cp870            IBM Multilingual Latin-2
    Cp871            IBM Iceland
    Cp874            IBM Thai
    Cp875            IBM Greek
    Cp918            IBM Pakistan(Urdu)
    Cp921            IBM Latvia, Lithuania (AIX, DOS)
    Cp922            IBM Estonia (AIX, DOS)
    Cp930            Japanese Katakana-Kanji mixed with 4370 UDC,
    superset of 5026     
    Cp933            Korean Mixed with 1880 UDC, superset of 5029
    Cp935            Simplified Chinese Host mixed with 1880 UDC,
    superset of 5031
    Cp937            Traditional Chinese Host miexed with 6204 UDC,
    superset of 5033
    Cp939            Japanese Latin Kanji mixed with 4370 UDC,
    superset of 5035   
    Cp942            Japanese (OS/2) superset of 932
    Cp948            OS/2 Chinese (Taiwan) superset of 938
    Cp949            PC Korean
    Cp950            PC Chinese (Hong Kong, Taiwan)
    Cp964            AIX Chinese (Taiwan)
    Cp970            AIX Korean
    EUCJIS           JIS, EUC Encoding, Japanese
    GB2312          GB2312, EUC encoding, Simplified Chinese
    GBK                GBK, Simplified Chinese
    ISO2022CN        ISO 2022 CN, Chinese
    ISO2022CN_CNS    CNS 11643 in ISO-2022-CN form, T. Chinese
    ISO2022CN_GB     GB 2312 in ISO-2022-CN form, S. Chinese
    ISO2022KR        ISO 2022 KR, Korean
    JIS                 JIS, Japanese
    JIS0208          JIS 0208, Japanese
    KOI8_R           KOI8-R, Russian
    KSC5601         KS C 5601, Korean
    MS874            Windows Thai
    MacArabic        Macintosh Arabic
    MacCentralEurope Macintosh Latin-2
    MacCroatian      Macintosh Croatian
    MacCyrillic         Macintosh Cyrillic
    MacDingbat       Macintosh Dingbat
    MacGreek          Macintosh Greek
    MacHebrew        Macintosh Hebrew
    MacIceland         Macintosh Iceland
    MacRoman         Macintosh Roman
    MacRomania       Macintosh Romania
    MacSymbol         Macintosh Symbol
    MacThai             Macintosh Thai
    MacTurkish        Macintosh Turkish
    MacUkraine        Macintosh Ukraine
    SJIS                 Shift-JIS, Japanese
    UTF8                UTF-8

     

    不过WTK可以直接解决JAD的中文问题:
     settings>MidLets>MidLet-1属性改成你想要显示的中文后重新生成JAD和JAR文件即可。

    JAVA字符的编码
    一、概要
    在JAVA应用程序特别是基于WEB的程序中,经常遇到字符的编码问题。为了防止出现乱码,首先需要了解JAVA是如何处理字符的,这样就可以有目的地在输入/输出环节中增加必要的转码。其次,由于各种服务器有不同的处理方式,还需要多做试验,确保使用中不出现乱码。
    二、基本概念
    2.1 JAVA中字符的表达
    JAVA 中有char、byte、String这几个概念。char 指的是一个UNICODE字符,为16位的整数。byte 是字节,字符串在网络传输或存储前需要转换为byte数组。在从网络接收或从存储设备读取后需要将byte数组转换成String。String是字符 串,可以看成是由char组成的数组。String 和 char 为内存形式,byte是网络传输或存储的序列化形式。
     举例:

    String ying = “英”;
    char ying = ying.charAt(0);
    String yingHex = Integer.toHexString(ying);
    82 F1   
    byte yingGBBytes = ying.getBytes(“GBK”);
    GB编码的字节数值
    D3 A2 

    2.2 编码方式的简介
     String序列化成byte数组或反序列化时需要选择正确的编码方式。如果编码方式不正确,就会得到一些0x3F的值。常用的字符编码方式有ISO8859_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。
    ISO8859_1用来编码拉丁文,它由单字节(0-255)组成。
     GB2312、GBK用来编码简体中文,它有单字节和双字节混合组成。最高位为1的字节和下一个字节构成一个汉字,最高位为0的字节是ASCII码。
    UTF-8/UTF-16/UTF-32是国际标准UNICODE的编码方式。 用得最多的是UTF-8,主要是因为它在对拉丁文编码时节约空间。

    UNICODE值 UTF-8编码
    U-00000000 - U-0000007F: 0xxxxxxx
    U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
    U-00000800 - U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx
    U-00010000 - U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    U-00200000 - U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    U-04000000 - U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

    三、J2SE中相关的函数
    String str =”英”;
     //取得GB2312编码的字节
    byte[] bytesGB2312 = str.getBytes(“GB2312”);

    //取得平台缺省编码的字节(solaris为ISO8859_1,windows为GB2312)
    byte[] bytesDefault = str.getBytes();

    //用指定的编码将字节转换成字符串
     String newStrGB = new String(bytesGB2312, “GB2312”);
     
    //用平台缺省的编码将字节转换成字符串(solaris为ISO8859_1,windows为GB2312)
     String newStrDefault = new String(bytesDefault);

     //用指定的编码从字节流里面读取字符
    InputStream in = xxx;
    InputStreamReader reader = InputStreamReader( in, “GB2312”);
    char aChar = reader.read();
    四、JSP、数据库的编码
    4.1 JSP中的编码
    (1) 静态声明:
    CHARSET有两个作用:
    JSP文件的编码方式:在读取JSP文件、生成JAVA类时,源JSP文件中汉字的编码
    JSP输出流的编码方式:在执行JSP时,往response流里面写入数据的编码方式
    (2) 动态改变:在往response流里面写数据前可以调用response.setContentType(),设定正确的编码类型。
    (3) 在TOMCAT中,由Request.getParameter() 得到的参数,编码方式都是ISO8859_1。所以如果在浏览器输入框内输入一个汉字“英”,在服务器端就得到一个ISO8859_1编码的 (0x00,0xD3,0x00,0xA2)。所以通常在接收参数时转码:
    String wrongStr = response.getParameter(“name”);
    String correctStr = new String(wrongStr.getBytes(“ISO8859_1”),”GB2312”);
    在最新的SERVLET规范里面,也可以在获取参数之前执行如下代码:
    request.setCharacterEncoding(“GB2312”);

    4.2 数据库的编码
    (1) 数据库使用UTF-16
    如果String中是UNICODE字符,写入读出时不需要转码
    (2) 数据库使用ISO8859_1
    如果String中是UNICODE字符,写入读出时需要转码
    写入:String newStr = new String(oldStr.getByte(“GB2312”), “ISO8859_1”);
    读出:String newStr = new String(oldStr.getByte(“ISO8859_1”),”GB2312”);
    五、源文件的编码
    5.1 资源文件
    资源文件的编码方式和编辑平台相关。在WINDOWS平台下编写的资源文件,以GB2312方式编码。在编译时需要转码,以确保在各个平台上的正确性:
    native2ascii –encoding GB2312 source.properties
    这样从资源文件中读出的就是正确的UNICODE字符串。
    5.2 源文件
    源文件的编码方式和编辑平台相关。在WINDOWS平台下开发的源文件,以GB2312方式编码。在编译的时候,需要指定源文件的编码方式:
    javac –encoding GB2312
     JAVA编译后生成的字节文件的编码为UTF-8。

    ①最新版TOMCAT4.1.18支持request.setCharacterEncoding(String enc)
    ②资源文件转码成company.name=\u82f1\u65af\u514b
    ③如果数据库使用utf-16则不需要这部分转码
    ④页面上应有
    转码ⅰ:
    String s = new String
    (request.getParameter(“name”).getBytes(“ISO8859_1”),”GB2312”);
    转码ⅱ:
    String s = new String(name.getBytes(“GB2312”),”ISO8859_1”);
    转码ⅲ:
    String s = new String(name.getBytes(“ISO8859_1”),” GB2312”);

     


    收藏到:Del.icio.us