關(guān)于java的字符編碼問題
關(guān)于字符編碼的概念及技巧
在基于 Java 語言的編程中,我們經(jīng)常碰到漢字的處理及顯示的問題。
Java 語言默認(rèn)的編碼方式是UNICODE ,它給JAVA帶來了活力,及更廣的適應(yīng)性,但是問題也隨之而來我們通常使用的文件和數(shù)據(jù)庫一般都是基于 GB2312或者 BIG5 等方式編碼的,怎樣才能夠恰當(dāng)?shù)剡x擇漢字編碼方式并正確地處理漢字的編碼呢?
英文字符一般是以一個(gè)字節(jié)來表示的,最常用的編碼方法是 ASCII 。但一個(gè)字節(jié)最多只能區(qū)分256個(gè)字符,而漢字成千上萬,所以現(xiàn)在都以雙字節(jié)來表示漢字,為了能夠與英文字符分開,每個(gè)字節(jié)的最高位一定為1,這樣雙字節(jié)最多可以表示64K格字符。我們經(jīng)常碰到的編碼方式有GB2312、BIG5、UNICODE 等。關(guān)于具體編碼方式的具體資料,有愛好的讀者可以查閱相關(guān)資料。GB2312是國標(biāo)碼。兩個(gè)字節(jié)中,第一個(gè)字節(jié)(高字節(jié))的值為區(qū)號(hào)值加32(20H),第二個(gè)字節(jié)(低字節(jié))的值為位號(hào)值加32(20H),用這兩個(gè)值來表示一個(gè)漢字的編碼。
UNICODE 碼是微軟提出的解決多國字符問題的多字節(jié)等長編碼,它對(duì)英文字符采取前面加“0”字節(jié)的策略實(shí)現(xiàn)等長兼容。如 “A” 的 ASCII 碼為0x41,UNICODE 就為0x00,0x41,利用非凡的工具各種編碼之間可以互相轉(zhuǎn)換。
我們經(jīng)常碰到這樣的情況:瀏覽基于 jsp 技術(shù)的網(wǎng)站看到的是亂碼,文件打開后看到的也是亂碼,這是因?yàn)?外部文件-> Java 字節(jié)碼-> ;虛擬機(jī)->操作系統(tǒng)->顯示設(shè)備” 這個(gè)轉(zhuǎn)變過程有了問題。首先看一個(gè)JSP中的解決中文問題的例子,我想這段代碼大家都很熟悉吧,
但他的具體含義是什么呢?為什么要這樣做呢?
String s1 = request.getParameter(“keyWord”);
//從request中取參數(shù) s1
byte[] bytes=s1.getBytes(“ISO-8859-1”);
//把s1(按Unicode->ISO-8859-1) 轉(zhuǎn)回原來的byte[]。
String s2 = new String(bytes,”GBK”);
//因?yàn)樵瓉淼膮?shù)(或字符,字串)是GBK編碼方式,所以把bytes
//按照GBK->Unicode的方式轉(zhuǎn)碼
為什么要這樣做呢?因?yàn)榻邮盏膮?shù)本來是GBK編碼方式的,但是缺省的用了
iso-8859-1->Unicode 的轉(zhuǎn)碼方式把參數(shù)轉(zhuǎn)成了String
所以肯定是亂碼(中文時(shí))
只要了解了這個(gè)基本道理,中文字符問題應(yīng)該都能解決!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注