關於字元編碼及native2ascii的使用

來源:互聯網
上載者:User

java程式顯示中文是大家都遇到過的問題,尤其是JAD檔案的中文問題,一般都用native2ascii工具轉換,這裡收藏了native2ascii工具的詳細說明:

native2ascii - Native-to-ASCII Converter
Converts a file with native-encoded characters (characters which are non-Latin 1 and non-Unicode) to one with Unicode-encoded characters. 
SYNOPSIS
native2ascii [options] [inputfile [outputfile]]

DESCRIPTION
The Java compiler and other Java tools can only process files which contain Latin-1 and/or Unicode-encoded (/udddd notation) characters. native2ascii converts files which contain other character encodings into files containing Latin-1 and/or Unicode-encoded charaters. 
If outputfile is omitted, standard output is used for output. If, in addition, inputfile is omitted, standard input is used for input. 

OPTIONS
-reverse 
Perform the reverse operation: convert a file with Latin-1 and/or Unicode encoded characters to one with native-encoded characters. 

-encoding encoding_name 
Specify the encoding name which is used by the conversion procedure. The default encoding is taken from System property file.encoding. The encoding_name string must be a string taken from the first column of the table below. 

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

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”);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.