programmer's home, welcome here!

          technical issues and my life

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          #

          Spring內(nèi)核研究-set方法注入和構(gòu)造函數(shù)注入

          Spring種提供了2種常用的注入方式,set方法注入和構(gòu)造函數(shù)注入。由于這2種注入方式很相似,都可以滿足我們的需求,所以在大多數(shù)情況下我們忽視了這2種注入方式的區(qū)別。下面讓我們看看這2種注入方式的特點(diǎn)。

                   我們先看看Spring在使用set方法注入時(shí),是怎樣實(shí)例化一個(gè)Bean和Bean的合作者的:

                  在A中有一個(gè)setB方法用來接收B對(duì)象的實(shí)例。那么Spring實(shí)例化A對(duì)象的過程如下:

                  在不考慮Bean的初始化方法和一些Spring回調(diào)的情況下,Spring首先去調(diào)用A對(duì)象的構(gòu)造函數(shù)實(shí)例化A,然后查找A依賴的對(duì)象本例子中是B(合作者)。一但找到合作者,Spring就會(huì)調(diào)用合作者(B)的構(gòu)造函數(shù)實(shí)例化B。如果B還有依賴的對(duì)象Spring會(huì)把B上依賴的所有對(duì)象都按照相同的機(jī)制實(shí)例化然后調(diào)用A對(duì)象的setB(B b)b對(duì)象注入給A
                  因?yàn)镾pring調(diào)用一個(gè)對(duì)象的set方法注入前,這個(gè)對(duì)象必須先被實(shí)例化。所以在"使用set方法注入"的情況下Spring會(huì)首先調(diào)用對(duì)象的構(gòu)造函數(shù)。
                  我們?cè)趤砜赐ㄟ^構(gòu)造函數(shù)注入的過程:

                  如果發(fā)現(xiàn)配置了對(duì)象的構(gòu)造注入,那么Spring會(huì)在調(diào)用構(gòu)造函數(shù)前把構(gòu)造函數(shù)需要的依賴對(duì)象都實(shí)例化好,然后再把這些實(shí)例化后的對(duì)象作為參數(shù)去調(diào)用構(gòu)造函數(shù)。
                  在使用構(gòu)造函數(shù)和set方法依賴注入時(shí),Spring處理對(duì)象和對(duì)象依賴的對(duì)象的順序時(shí)不一樣的。一般把一個(gè)Bean設(shè)計(jì)為構(gòu)造函數(shù)接收依賴對(duì)象時(shí),其實(shí)是表達(dá)了這樣一種關(guān)系:他們(依賴對(duì)象)不存在時(shí)我也不存在,即“沒有他們就沒有我”。
                  通過構(gòu)造函數(shù)的注入方式其實(shí)表達(dá)了2個(gè)對(duì)象間的一種強(qiáng)的聚合關(guān)系:組合關(guān)系。就比如一輛車如果沒有輪子、引擎等部件那么車也就不存在了。而且車是由若干重要部件組成的,在這些部件沒有的情況下車也不可能存在。這里車和他的重要部件就時(shí)組合的關(guān)系。如果你的應(yīng)用中有這樣類似的場(chǎng)景那么你應(yīng)該使用“構(gòu)造函數(shù)注入”的方式管理他們的關(guān)系。“構(gòu)造函數(shù)注入”可以保證合作者先創(chuàng)建,在后在創(chuàng)建自己。
                  通過set方法注入的方式表達(dá)了2個(gè)對(duì)象間較弱的依賴關(guān)系:聚合關(guān)系。就像一輛車,如果沒有車內(nèi)音像車也時(shí)可以工作的。當(dāng)你不要求合作者于自己被創(chuàng)建時(shí),“set方法注入”注入比較合適。
                  雖然在理論上“構(gòu)造函數(shù)注入”和“set方法注入”代表2種不同的依賴強(qiáng)度,但是在spring中,spring并不會(huì)把無效的合作者傳遞給一個(gè)bean。如果合作者無效或不存在spring會(huì)拋出異常,這樣spring保證一個(gè)對(duì)象的合作者都是可用的。所以在spring中,“構(gòu)造函數(shù)注入”和“set方法注入”唯一的區(qū)別在于2種方式創(chuàng)建合作者的順序不同。
                  使用構(gòu)造函數(shù)依賴注入時(shí),Spring保證所有一個(gè)對(duì)象所有依賴的對(duì)象先實(shí)例化后,才實(shí)例化這個(gè)對(duì)象。(沒有他們就沒有我原則)
                  使用set方法依賴注入時(shí),Spring首先實(shí)例化對(duì)象,然后才實(shí)例化所有依賴的對(duì)象。

          posted @ 2007-04-09 02:56 crazy zerlot 閱讀(1455) | 評(píng)論 (0)編輯 收藏

          SWT/JFace開發(fā)入門指南-轉(zhuǎn)載

          寫在前面的話

          終于決定提起筆來寫一篇關(guān)于swt和JFace編程的文章。在開始之前,我想先介紹一下你能夠從將要出現(xiàn)的這一系列文章里得到什么,以及更重要的,你不能得到什么。我們的時(shí)間是如此之重要,以至于我們很難容忍把它浪費(fèi)在自己不關(guān)心的事情上。

          因?yàn)槲覄傞_始寫,所以到底這些文章會(huì)分成幾次發(fā)布出來,也很難講。但是我心里大體有這樣一個(gè)提綱。也就是說,我打算介紹以下方面的內(nèi)容:

                   設(shè)定swt以及JFace的開發(fā)環(huán)境

                   swt的一些簡(jiǎn)單部件(widget)介紹

                   JFace的一些入門性介紹

                   swt和JFace的事件模式

                 通過一些簡(jiǎn)單的例子說明如何利用swt和JFace編寫圖形化應(yīng)用程序

           

          我還要說明一下你不能從本文中得到的信息,這些信息包括:

                   swt和JFace相關(guān)內(nèi)容非常深入的介紹:正如你從題目中了解到的,本文的定位是“入門”,也就是說假定的讀者是那些對(duì)swt和JFace開發(fā)沒有什么了解的人。所以我并不打算進(jìn)行一個(gè)深入的介紹。因?yàn)槲蚁嘈旁谌腴T之后,他們能夠找到更好的資料(此外,我可能會(huì)寫另外一個(gè)系列文章來介紹)。

                   eclipse的使用:我假定你在讀這篇文章的時(shí)候已經(jīng)對(duì)eclipse有所了解,所以不會(huì)解釋到具體eclipse如何使用。

                   eclipse插件開發(fā):雖然eclipse插件開發(fā)和本文內(nèi)容有著千絲萬縷的聯(lián)系,我決定還是不把它列為介紹的內(nèi)容。這方面,你仍然可以找到相當(dāng)多的資料供參考。

                 
          第一個(gè)SWT 程序
                  1。加入項(xiàng)目要包含的LIB
                  2。如果是在Windwos下面做開發(fā),則還需要要一個(gè)org.eclipse.swt.win32_3.x.x.jar文件,這個(gè)文件要解壓縮,其中的幾個(gè)DLL文件要被JAVA 用JNI 調(diào)用,所以把DLL 文件的目錄加入到PATH 中。

                  代碼:     
          1package swtjfacesample;
           
          2
           3
          import org.eclipse.swt.SWT;
           4
          import org.eclipse.swt.widgets.Display;
           5
          import org.eclipse.swt.widgets.Shell;
           6
          import org.eclipse.swt.widgets.Text;
           
          7
           8
          public class HelloSwt {
           
          9    /**//**
          10     * Hello,world!
          11     * 
          12     * 
          @param args
          13     
          */

          14       public static void main(String[] args) {
          15        Display display = new Display();
          16        Shell shell = new Shell(display);
          17        
          18        Text helloText = new Text(shell, SWT.CENTER);
          19        helloText.setText("Hello,World!");
          20        helloText.pack();
          21        
          22        shell.pack();
          23        shell.open();
          24
          25        while (!shell.isDisposed()) {
          26            if (!display.readAndDispatch()) {
          27                display.sleep();
          28            }

          29        }

          30        display.dispose();
          31
          32    }

          33}

          34


          運(yùn)行為SWT 應(yīng)用程序,彈出一個(gè)小窗口,上面寫著Hello World!







          posted @ 2007-04-07 23:16 crazy zerlot 閱讀(229) | 評(píng)論 (0)編輯 收藏

          J2EE 架構(gòu)師的SCEA認(rèn)證(轉(zhuǎn)載)

            網(wǎng)絡(luò)上搜到的SCEA 的考試經(jīng)驗(yàn),希望對(duì)大家有所幫助!

          正文:

          今天,2005年4月9號(hào)中午,我通過了Sun的系統(tǒng)架構(gòu)師考試(SCEA)的310-051部分。總成績(jī)72%(很勉強(qiáng),及格線68%)。面向?qū)ο蟾拍睢JB、設(shè)計(jì)模式、消息、國(guó)際化等部分都對(duì)了80-100%;通用架構(gòu)、遺留系統(tǒng)連接、EJB容器、協(xié)議、J2EE應(yīng)用、安全等部分只有50-66%左右的正確率。
          但好歹整體是pass,否則又浪費(fèi)銀子了——1250RMB實(shí)在太貴。就在昨晚,老公明白我今天就要考試,馬上表達(dá)了他的不滿:
          第一、 他認(rèn)為我準(zhǔn)備不夠,肯定pass不了,簡(jiǎn)直是浪費(fèi)銀子。
          第二、 他認(rèn)為我那么早考過,就不會(huì)接著深入學(xué)習(xí),很快會(huì)忘掉這些知識(shí)滴。

          但我今天早上還是在他極不看好的抱怨聲中去考試。第一道題就是又臭又長(zhǎng)的遺留系統(tǒng)連接題,這些電腦屏幕上的英文馬上讓我的腦袋轟地暈了。所以接下來我一直是在極度緊張暈乎乎的情況下考試的。
          臭長(zhǎng)的情景題目奇多,我以為時(shí)間不一定夠,心情緊張地完全影響了我做題效果。但我依然30分鐘左右把48個(gè)題目全部做了一遍。然后再用25分鐘左右仔細(xì)檢查了一遍,特別仔細(xì)研究那些臭長(zhǎng)的題目,所有題目全部用排錯(cuò)法選一次答案,但被重新選擇答案的題目不超過5個(gè)。剩下20分鐘左右時(shí),又開始重新過一遍,但做到第34時(shí),整個(gè)考試就over了,打印機(jī)就刷刷刷打印成績(jī)。我沒看到屏幕上的成績(jī)提示,很著急,馬上直接去看打印機(jī)吐出來的紙,直到看到成績(jī)是pass,才知道這1250塊是沒有浪費(fèi)掉。
          從考場(chǎng)出來,恰好老公打電話來匯報(bào)他酒店的房間可看海景。我告訴他我過了,并埋怨自己備考方向不十分正確導(dǎo)致成績(jī)不算良好。他很意外我通過了沒有浪費(fèi)錢;然后打斷我詳細(xì)的成績(jī)匯報(bào),叫我不要太得意。

          其實(shí),我覺得如果備考得當(dāng),是很可能拿到80%的。但現(xiàn)在根本沒有什么書能完全覆蓋了Sun的考試范圍,也沒有很update的guideline。通過這次實(shí)戰(zhàn),我覺得我知道了Sun的真實(shí)考試范圍,因此覺得有必要整理出來,讓后來者少走彎路。
          我認(rèn)為有三個(gè)資料是大家主要應(yīng)該關(guān)注的。
          1.《J2EE學(xué)習(xí)指南-Sun   certified   enterprise   architect   for   J2EE   (Exam   310-051)(英文版)》,一定要讀英文版,因?yàn)榭荚囀怯⑽摹aul   R.Allen,Joseph   J.Bambara   人民郵電出版社。
          這本書粗看是覆蓋了SCEA全部大綱,但其實(shí)很多真正考試內(nèi)容沒涉及,比如遺留系統(tǒng)連接、安全、集群、負(fù)載平衡。而遺留系統(tǒng)連接部分,最新的JCA并沒有考,考的還是Screen   Scraper及Corba等綜合技術(shù)連接各種復(fù)雜的遺留系統(tǒng)。其他內(nèi)容,該書也寫的很羅索,不精煉。
          2.   《Sun   Certified   Enterprise   Architect   for   J2EE   Technology   Study   Guide》Prentice   Hall   著,作者是Sun的,該書接近于Sun的官方資料了。
          這本書很好,簡(jiǎn)潔、扼要,非常適合最后沖刺階段使用。但缺點(diǎn)是完全沒有消息、遺留系統(tǒng)連接等內(nèi)容。但是設(shè)計(jì)模式、協(xié)議、安全等部分相當(dāng)好,至少比《J2EE學(xué)習(xí)指南》好。集群、負(fù)載平衡等部分,這本書一樣沒涉及。
          我自己翻譯了這本書的中文簡(jiǎn)版,如果想對(duì)J2EE入個(gè)門,可以參考。但最好讀原文。連英文技術(shù)資料都看不懂的人,我想絕對(duì)通不過這個(gè)考試的,考試中的情景題都是很長(zhǎng)的英文。《中文Sun的系統(tǒng)架構(gòu)師認(rèn)證教材》http://community.csdn.net/Expert/topic/3892/3892784.xml?temp=.1181452
          3.yahoo討論組上的資源,有最接近Sun考試范圍的資料和題目,是考80%的最好保證。
          scea_j2ee     http://groups.yahoo.com/group/scea_j2ee
          scea_prep     http://groups.yahoo.com/group/scea_prep
          特別推薦的是《Java   Architect   Notes   -   Balaji.doc》和《SCEA   Practice   Questions1.zip》及其他類似電子文檔。
          Balaji等人的筆記,更符合Sun實(shí)際考試的內(nèi)容,比以上兩本書更貼近考試范圍。比如其中提到的集群、負(fù)載平衡、遺留系統(tǒng)連接等技術(shù),今天我都被考到,而且我都沒考好。因?yàn)橹拔乙恢币詾槌霭娴臅赡苜N近考試,而我對(duì)上面兩本書的知識(shí)點(diǎn)都掌握到90%。但我接觸yahoo的資料很遲,對(duì)這些資料跟那兩本書的不同很懷疑,懷疑yahoo的資料不正確。但實(shí)際考試告訴我,yahoo的資料更正確。
          《SCEA   Practice   Questions1.zip》這些題目,多數(shù)跟Sun考試接近,特別是安全、遺留系統(tǒng)連接、集群、負(fù)載平衡等情景分析題,J2EE應(yīng)用分析題等。但那些很detail的,接近編程的題目,可能不會(huì)考。而且這些題目的結(jié)果分析部分特別詳盡,非常有利于讓你處理J2EE選型等情景題目。
          尤其是其中部分題就基本重現(xiàn)在我今天的考試中,那些關(guān)于集群、負(fù)載平衡、J2EE應(yīng)用分析的情景題。如果再考一次,我發(fā)誓我會(huì)把yahoo   group中的題目用心重做一遍。那樣我絕對(duì)可以拿到80%了。


          我覺得SCEA考試是一個(gè)覆蓋面很廣的東東。備考的過程中,絕對(duì)可以優(yōu)化、充實(shí)自己的技術(shù)知識(shí)。比如通過這段時(shí)間的學(xué)習(xí),我覺得我更了解J2EE及實(shí)際系統(tǒng)選型,也學(xué)會(huì)了設(shè)計(jì)模式。之前我基本是設(shè)計(jì)模式盲,現(xiàn)在我卻可以歷歷數(shù)出各模式的特點(diǎn),甚至有更深入研究的興趣。我覺得備考SCEA是學(xué)習(xí)更多知識(shí)的方式,而考試結(jié)果只是附加的回報(bào)。

          備考時(shí)間和步驟建議:
          先介紹本人的背景和準(zhǔn)備時(shí)間。
          本人具有多年J2EE工作經(jīng)驗(yàn),很早學(xué)習(xí)OOA、J2EE,很早就深入學(xué)習(xí)、模擬過pet   store的framework。工作中的項(xiàng)目有很多practices及EJB   pattern,但這個(gè)很好的framework我沒參與設(shè)計(jì)。
          大概是去年(04年)11月初左右有了考SCEA的想法。然后買了上面提到的《J2EE學(xué)習(xí)指南》。在年前看完了這本書,同時(shí)就著《設(shè)計(jì)模式(中文版)》、《設(shè)計(jì)模式和Java》等書,對(duì)設(shè)計(jì)模式入了門。原來想年前考,但工作突然趨緊,加上要過年、寫網(wǎng)絡(luò)小說、看小說,就把考試計(jì)劃推遲到年后。
          過了年,又因?yàn)榉中娜?#8220;研究”宏微觀的經(jīng)濟(jì)、管理及把手頭長(zhǎng)編網(wǎng)絡(luò)小說over掉,也就不敢貿(mào)然考試。但工作輕松,所以還是花了很多時(shí)間學(xué)習(xí)SCEA。
          進(jìn)入三月下旬(20號(hào)之后),我的SCEA沖刺階段開始了。反反復(fù)復(fù)看前面提到的兩本書和設(shè)計(jì)模式,終于把設(shè)計(jì)模式給吃下了。一直到三月底,才接觸到Balaji的《Java   Architect   Notes》,做yahoo上共享的題目。做題結(jié)果很慘,正確率只有50%左右。所以很快發(fā)現(xiàn)自己在情景題、安全等方面的不足,并力補(bǔ)之,同時(shí)花了2天半,把《Sun   Certified   Enterprise   Architect   for   J2EE   Technology   Study   Guide》翻譯了一下。
          到了4月2號(hào),我決定報(bào)名9號(hào)考試。然后又把那2本書看一編,把《SCEA   Practice   Questions1.zip》等數(shù)百套題過一遍。6號(hào)交錢報(bào)名。7號(hào)下午通過作題,就發(fā)現(xiàn)自己不是很行。8號(hào)打印Sun的考試大綱,發(fā)現(xiàn)有些地方要加強(qiáng)。但最后認(rèn)為安全、遺留系統(tǒng)連接、集群、負(fù)載平衡等比率不多,幻想Sun不會(huì)考那些DNS集群機(jī)制等題目,所以還是決定去考試(已經(jīng)報(bào)名了,也不可能推遲)。可是9號(hào)考試的時(shí)候,心理很明白準(zhǔn)備不充分,因此考試特別緊張。但謝天謝地,我面向?qū)ο蟾拍睢JB、設(shè)計(jì)模式、消息、國(guó)際化等扎實(shí)的底子和yahoo資料給我的遺留系統(tǒng)連接、集群、負(fù)載平衡的粗淺印象,到底還是讓我pass了。

          要說明的是,我全部是工作時(shí)學(xué)習(xí),根據(jù)工作強(qiáng)度,每天有0-7個(gè)小時(shí)學(xué)習(xí)。周末和晚上是不學(xué)習(xí)的。周末用來辦事、逛街、去公園;晚上用來上網(wǎng)。

          我覺得準(zhǔn)備SCEA的時(shí)間因人而異。對(duì)于普通水平,如我,若集中學(xué)習(xí),2-3個(gè)月夠了;對(duì)于更高水平,1個(gè)月甚至更短也行;對(duì)于水平更差,我想4-6個(gè)月都可能。

          最后要強(qiáng)調(diào)的是英語。這個(gè)考試有接近50%是臭長(zhǎng)的情景題,還是多項(xiàng)選擇,如果基本英語要求都達(dá)不到的人,可能連正確理解題目都困難。而另外那些簡(jiǎn)短的題目,偶爾也有一兩個(gè)不認(rèn)識(shí)的關(guān)鍵的單詞,這絕對(duì)影響作題,因?yàn)槟菚?huì)讓你不知道整個(gè)句子的概念。我考試就遇到1-2個(gè)這樣的題目其中各有1個(gè)不認(rèn)識(shí)的關(guān)鍵的單詞。我很懷疑通用架構(gòu)、J2EE應(yīng)用部分我得分過底就是因?yàn)檫@個(gè)原因。
          搞定英語,我覺得只能是基本只看英文資料和做英文題目。我的英語底子一般,也就四級(jí)水平,工作是純英文,近兩年除了小說、新聞看中文的,其他只看英文。但我的英語還是稍微影響了我的考試,至少我是這樣認(rèn)為的。

          以上是我考后的感想。我覺得yahoo上的資料最符合sun考試范圍的;但那兩本書應(yīng)該是主要的學(xué)習(xí)基礎(chǔ)。如果EJB不熟的人,其他一些EJB書籍都很必要。

          如果大家希望有個(gè)學(xué)習(xí)計(jì)劃的參考,我建議是:
          1.先學(xué)《J2EE學(xué)習(xí)指南》和其他的有名的EJB書籍(一本網(wǎng)上最著名、最流行的就行了)。這個(gè)時(shí)間應(yīng)該1個(gè)月左右。
          2.再學(xué)習(xí)《Sun   Certified   Enterprise   Architect   for   J2EE   Technology   Study   Guide》。
          3.然后學(xué)習(xí)Balaji的筆記。
          4.打印Sun的考試大綱,逐條檢驗(yàn)知識(shí)點(diǎn)。
          考試大綱   http://www.sun.com/training/catalog/courses/CX-310-051.xml
          5.做yahoo上的《SCEA   Practice   Questions1.zip》等題目。
          6.考試前2天,根據(jù)做題經(jīng)驗(yàn),結(jié)合考試大綱,再逐一根據(jù)各知識(shí)點(diǎn)復(fù)習(xí)。
          7.考試時(shí),也許第一個(gè)題目就是很長(zhǎng)的英文題。不用被嚇著,穩(wěn)定心態(tài)做下去。你會(huì)發(fā)現(xiàn)后面那些簡(jiǎn)短的題目幾秒鐘就可以搞定一個(gè)。你肯定有時(shí)間回頭檢查的。

          310-051只是系統(tǒng)架構(gòu)師的第一步,后面還有Assignment   (CX-310-300A)   、Essay   Exam   (CX-310-061)兩步。我不知道我什么時(shí)候會(huì)考,考試費(fèi)太貴了(全程5000),最好能找個(gè)地方報(bào)銷。我更看中學(xué)習(xí)過程及實(shí)際掌握的知識(shí),考試的結(jié)果,尤其是證書,天曉得有沒有用。但第一步應(yīng)該是最難的一步,選擇題考過了,剩下兩步應(yīng)該更容易。也許我會(huì)去考,如果考過了,如果有經(jīng)驗(yàn),我一樣會(huì)來分享的。考慮到第一個(gè)1250花出去,我老公可能會(huì)催我考下去,他會(huì)覺得既然花錢了,那么搞個(gè)證書才合算。哈哈!

          posted @ 2007-04-07 04:29 crazy zerlot 閱讀(3946) | 評(píng)論 (13)編輯 收藏

          java字符集(轉(zhuǎn)自鍵者天行)

          1. 概述 

          本文主要包括以下幾個(gè)方面:編碼基本知識(shí),java,系統(tǒng)軟件,url,工具軟件等。 

          在下面的描述中,將以"中文"兩個(gè)字為例,經(jīng)查表可以知道其GB2312編碼是"d6d0 cec4",Unicode編碼為"4e2d 6587",UTF編碼就是"e4b8ad e69687"。注意,這兩個(gè)字沒有iso8859-1編碼,但可以用iso8859-1編碼來"表示"。 

          2. 編碼基本知識(shí) 

          最早的編碼是iso8859-1,和ascii編碼相似。但為了方便表示各種各樣的語言,逐漸出現(xiàn)了很多標(biāo)準(zhǔn)編碼,重要的有如下幾個(gè)。 

          2.1. iso8859-1 

          屬于單字節(jié)編碼,最多能表示的字符范圍是0-255,應(yīng)用于英文系列。比如,字母'a'的編碼為0x61=97。 

          很明顯,iso8859-1編碼表示的字符范圍很窄,無法表示中文字符。但是,由于是單字節(jié)編碼,和計(jì)算機(jī)最基礎(chǔ)的表示單位一致,所以很多時(shí)候,仍舊使用iso8859-1編碼來表示。而且在很多協(xié)議上,默認(rèn)使用該編碼。比如,雖然"中文"兩個(gè)字不存在iso8859-1編碼,以gb2312編碼為例,應(yīng)該是"d6d0 cec4"兩個(gè)字符,使用iso8859-1編碼的時(shí)候則將它拆開為4個(gè)字節(jié)來表示:"d6 d0 ce c4"(事實(shí)上,在進(jìn)行存儲(chǔ)的時(shí)候,也是以字節(jié)為單位處理的)。而如果是UTF編碼,則是6個(gè)字節(jié)"e4 b8 ad e6 96 87"。很明顯,這種表示方法還需要以另一種編碼為基礎(chǔ)。 

          2.2. GB2312/GBK 

          這就是漢子的國(guó)標(biāo)碼,專門用來表示漢字,是雙字節(jié)編碼,而英文字母和iso8859-1一致(兼容iso8859-1編碼)。其中g(shù)bk編碼能夠用來同時(shí)表示繁體字和簡(jiǎn)體字,而gb2312只能表示簡(jiǎn)體字,gbk是兼容gb2312編碼的。 

          2.3. unicode 

          這是最統(tǒng)一的編碼,可以用來表示所有語言的字符,而且是定長(zhǎng)雙字節(jié)(也有四字節(jié)的)編碼,包括英文字母在內(nèi)。所以可以說它是不兼容iso8859-1編碼的,也不兼容任何編碼。不過,相對(duì)于iso8859-1編碼來說,uniocode編碼只是在前面增加了一個(gè)0字節(jié),比如字母'a'為"00 61"。 

          需要說明的是,定長(zhǎng)編碼便于計(jì)算機(jī)處理(注意GB2312/GBK不是定長(zhǎng)編碼),而unicode又可以用來表示所有字符,所以在很多軟件內(nèi)部是使用unicode編碼來處理的,比如java。 

          2.4. UTF 

          考慮到unicode編碼不兼容iso8859-1編碼,而且容易占用更多的空間:因?yàn)閷?duì)于英文字母,unicode也需要兩個(gè)字節(jié)來表示。所以u(píng)nicode不便于傳輸和存儲(chǔ)。因此而產(chǎn)生了utf編碼,utf編碼兼容iso8859-1編碼,同時(shí)也可以用來表示所有語言的字符,不過,utf編碼是不定長(zhǎng)編碼,每一個(gè)字符的長(zhǎng)度從1-6個(gè)字節(jié)不等。另外,utf編碼自帶簡(jiǎn)單的校驗(yàn)功能。一般來講,英文字母都是用一個(gè)字節(jié)表示,而漢字使用三個(gè)字節(jié)。 

          注意,雖然說utf是為了使用更少的空間而使用的,但那只是相對(duì)于unicode編碼來說,如果已經(jīng)知道是漢字,則使用GB2312/GBK無疑是最節(jié)省的。不過另一方面,值得說明的是,雖然utf編碼對(duì)漢字使用3個(gè)字節(jié),但即使對(duì)于漢字網(wǎng)頁,utf編碼也會(huì)比unicode編碼節(jié)省,因?yàn)榫W(wǎng)頁中包含了很多的英文字符。 

          3. java對(duì)字符的處理 

          在java應(yīng)用軟件中,會(huì)有多處涉及到字符集編碼,有些地方需要進(jìn)行正確的設(shè)置,有些地方需要進(jìn)行一定程度的處理。 

          3.1. getBytes(charset) 

          這是java字符串處理的一個(gè)標(biāo)準(zhǔn)函數(shù),其作用是將字符串所表示的字符按照charset編碼,并以字節(jié)方式表示。注意字符串在java內(nèi)存中總是按unicode編碼存儲(chǔ)的。比如"中文",正常情況下(即沒有錯(cuò)誤的時(shí)候)存儲(chǔ)為"4e2d 6587",如果charset為"gbk",則被編碼為"d6d0 cec4",然后返回字節(jié)"d6 d0 ce c4"。如果charset為"utf8"則最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1",則由于無法編碼,最后返回 "3f 3f"(兩個(gè)問號(hào))。 

          3.2. new String(charset) 

          這是java字符串處理的另一個(gè)標(biāo)準(zhǔn)函數(shù),和上一個(gè)函數(shù)的作用相反,將字節(jié)數(shù)組按照charset編碼進(jìn)行組合識(shí)別,最后轉(zhuǎn)換為unicode存儲(chǔ)。參考上述getBytes的例子,"gbk" 和"utf8"都可以得出正確的結(jié)果"4e2d 6587",但iso8859-1最后變成了"003f 003f"(兩個(gè)問號(hào))。 

          因?yàn)閡tf8可以用來表示/編碼所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) === str,即完全可逆。 

          3.3. setCharacterEncoding() 

          該函數(shù)用來設(shè)置http請(qǐng)求或者相應(yīng)的編碼。 

          對(duì)于request,是指提交內(nèi)容的編碼,指定后可以通過getParameter()則直接獲得正確的字符串,如果不指定,則默認(rèn)使用iso8859-1編碼,需要進(jìn)一步處理。參見下述"表單輸入"。值得注意的是在執(zhí)行setCharacterEncoding()之前,不能執(zhí)行任何getParameter()。java doc上說明:This method must be called prior to reading request parameters or reading input using getReader()。而且,該指定只對(duì)POST方法有效,對(duì)GET方法無效。分析原因,應(yīng)該是在執(zhí)行第一個(gè)getParameter()的時(shí)候,java將會(huì)按照編碼分析所有的提交內(nèi)容,而后續(xù)的getParameter()不再進(jìn)行分析,所以setCharacterEncoding()無效。而對(duì)于GET方法提交表單是,提交的內(nèi)容在URL中,一開始就已經(jīng)按照編碼分析所有的提交內(nèi)容,setCharacterEncoding()自然就無效。 

          對(duì)于response,則是指定輸出內(nèi)容的編碼,同時(shí),該設(shè)置會(huì)傳遞給瀏覽器,告訴瀏覽器輸出內(nèi)容所采用的編碼。 

          3.4. 處理過程 

          下面分析兩個(gè)有代表性的例子,說明java對(duì)編碼有關(guān)問題的處理方法。 

          3.4.1. 表單輸入 

          User input  *(gbk:d6d0 cec4)  browser  *(gbk:d6d0 cec4)  web server  iso8859-1(00d6 00d 000ce 00c4)  class,需要在class中進(jìn)行處理:getbytes("iso8859-1")為d6 d0 ce c4,new String("gbk")為d6d0 cec4,內(nèi)存中以u(píng)nicode編碼則為4e2d 6587。 

          l 用戶輸入的編碼方式和頁面指定的編碼有關(guān),也和用戶的操作系統(tǒng)有關(guān),所以是不確定的,上例以gbk為例。 

          l 從browser到web server,可以在表單中指定提交內(nèi)容時(shí)使用的字符集,否則會(huì)使用頁面指定的編碼。而如果在url中直接用?的方式輸入?yún)?shù),則其編碼往往是操作系統(tǒng)本身的編碼,因?yàn)檫@時(shí)和頁面無關(guān)。上述仍舊以gbk編碼為例。 

          l Web server接收到的是字節(jié)流,默認(rèn)時(shí)(getParameter)會(huì)以iso8859-1編碼處理之,結(jié)果是不正確的,所以需要進(jìn)行處理。但如果預(yù)先設(shè)置了編碼(通過request. setCharacterEncoding ()),則能夠直接獲取到正確的結(jié)果。 

          l 在頁面中指定編碼是個(gè)好習(xí)慣,否則可能失去控制,無法指定正確的編碼。 

          3.4.2. 文件編譯 

          假設(shè)文件是gbk編碼保存的,而編譯有兩種編碼選擇:gbk或者iso8859-1,前者是中文windows的默認(rèn)編碼,后者是linux的默認(rèn)編碼,當(dāng)然也可以在編譯時(shí)指定編碼。 

          Jsp  *(gbk:d6d0 cec4)  java file  *(gbk:d6d0 cec4)  compiler read  uincode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)  compiler write  utf(gbk: e4b8ad e69687; iso8859-1: *)  compiled file  unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)  class。所以用gbk編碼保存,而用iso8859-1編譯的結(jié)果是不正確的。 

          class  unicode(4e2d 6587)  system.out / jsp.out  gbk(d6d0 cec4)  os console / browser。 

          l 文件可以以多種編碼方式保存,中文windows下,默認(rèn)為ansi/gbk。 

          l 編譯器讀取文件時(shí),需要得到文件的編碼,如果未指定,則使用系統(tǒng)默認(rèn)編碼。一般class文件,是以系統(tǒng)默認(rèn)編碼保存的,所以編譯不會(huì)出問題,但對(duì)于jsp文件,如果在中文windows下編輯保存,而部署在英文linux下運(yùn)行/編譯,則會(huì)出現(xiàn)問題。所以需要在jsp文件中用pageEncoding指定編碼。 

          l Java編譯的時(shí)候會(huì)轉(zhuǎn)換成統(tǒng)一的unicode編碼處理,最后保存的時(shí)候再轉(zhuǎn)換為utf編碼。 

          l 當(dāng)系統(tǒng)輸出字符的時(shí)候,會(huì)按指定編碼輸出,對(duì)于中文windows下,System.out將使用gbk編碼,而對(duì)于response(瀏覽器),則使用jsp文件頭指定的contentType,或者可以直接為response指定編碼。同時(shí),會(huì)告訴browser網(wǎng)頁的編碼。如果未指定,則會(huì)使用iso8859-1編碼。對(duì)于中文,應(yīng)該為browser指定輸出字符串的編碼。 

          l browser顯示網(wǎng)頁的時(shí)候,首先使用response中指定的編碼(jsp文件頭指定的contentType最終也反映在response上),如果未指定,則會(huì)使用網(wǎng)頁中meta項(xiàng)指定中的contentType。 

          3.5. 幾處設(shè)置 

          對(duì)于web應(yīng)用程序,和編碼有關(guān)的設(shè)置或者函數(shù)如下。 

          3.5.1. jsp編譯 

          指定文件的存儲(chǔ)編碼,很明顯,該設(shè)置應(yīng)該置于文件的開頭。例如:<%@page pageEncoding="GBK"%>。另外,對(duì)于一般class文件,可以在編譯的時(shí)候指定編碼。 

          3.5.2. jsp輸出 

          指定文件輸出到browser是使用的編碼,該設(shè)置也應(yīng)該置于文件的開頭。例如:<%@ page contentType="text/html; charset= GBK" %>。該設(shè)置和response.setCharacterEncoding("GBK")等效。 

          3.5.3. meta設(shè)置 

          指定網(wǎng)頁使用的編碼,該設(shè)置對(duì)靜態(tài)網(wǎng)頁尤其有作用。因?yàn)殪o態(tài)網(wǎng)頁無法采用jsp的設(shè)置,而且也無法執(zhí)行response.setCharacterEncoding()。例如:<META http-equiv="Content-Type" content="text/html; charset=GBK" /> 

          如果同時(shí)采用了jsp輸出和meta設(shè)置兩種編碼指定方式,則jsp指定的優(yōu)先。因?yàn)閖sp指定的直接體現(xiàn)在response中。 

          需要注意的是,apache有一個(gè)設(shè)置可以給無編碼指定的網(wǎng)頁指定編碼,該指定等同于jsp的編碼指定方式,所以會(huì)覆蓋靜態(tài)網(wǎng)頁中的meta指定。所以有人建議關(guān)閉該設(shè)置。 

          3.5.4. form設(shè)置 

          當(dāng)瀏覽器提交表單的時(shí)候,可以指定相應(yīng)的編碼。例如:<form accept-charset= "gb2312">。一般不必不使用該設(shè)置,瀏覽器會(huì)直接使用網(wǎng)頁的編碼。 

          4. 系統(tǒng)軟件 

          下面討論幾個(gè)相關(guān)的系統(tǒng)軟件。 

          4.1. mysql數(shù)據(jù)庫 

          很明顯,要支持多語言,應(yīng)該將數(shù)據(jù)庫的編碼設(shè)置成utf或者unicode,而utf更適合與存儲(chǔ)。但是,如果中文數(shù)據(jù)中包含的英文字母很少,其實(shí)unicode更為適合。 

          數(shù)據(jù)庫的編碼可以通過mysql的配置文件設(shè)置,例如default-character-set=utf8。還可以在數(shù)據(jù)庫鏈接URL中設(shè)置,例如: useUnicode=true&characterEncoding=UTF-8。注意這兩者應(yīng)該保持一致,在新的sql版本里,在數(shù)據(jù)庫鏈接URL里可以不進(jìn)行設(shè)置,但也不能是錯(cuò)誤的設(shè)置。 

          4.2. apache 

          appache和編碼有關(guān)的配置在httpd.conf中,例如AddDefaultCharset UTF-8。如前所述,該功能會(huì)將所有靜態(tài)頁面的編碼設(shè)置為UTF-8,最好關(guān)閉該功能。 

          另外,apache還有單獨(dú)的模塊來處理網(wǎng)頁響應(yīng)頭,其中也可能對(duì)編碼進(jìn)行設(shè)置。 

          4.3. linux默認(rèn)編碼 

          這里所說的linux默認(rèn)編碼,是指運(yùn)行時(shí)的環(huán)境變量。兩個(gè)重要的環(huán)境變量是LC_ALL和LANG,默認(rèn)編碼會(huì)影響到j(luò)ava URLEncode的行為,下面有描述。 

          建議都設(shè)置為"zh_CN.UTF-8"。 

          4.4. 其它 

          為了支持中文文件名,linux在加載磁盤時(shí)應(yīng)該指定字符集,例如:mount /dev/hda5 /mnt/hda5/ -t ntfs -o iocharset=gb2312。 

          另外,如前所述,使用GET方法提交的信息不支持request.setCharacterEncoding(),但可以通過tomcat的配置文件指定字符集,在tomcat的server.xml文件中,形如:<Connector ... URIEncoding="GBK"/>。這種方法將統(tǒng)一設(shè)置所有請(qǐng)求,而不能針對(duì)具體頁面進(jìn)行設(shè)置,也不一定和browser使用的編碼相同,所以有時(shí)候并不是所期望的。 

          5. URL地址 

          URL地址中含有中文字符是很麻煩的,前面描述過使用GET方法提交表單的情況,使用GET方法時(shí),參數(shù)就是包含在URL中。 

          5.1. URL編碼 

          對(duì)于URL中的一些特殊字符,瀏覽器會(huì)自動(dòng)進(jìn)行編碼。這些字符除了"/?&"等外,還包括unicode字符,比如漢子。這時(shí)的編碼比較特殊。 

          IE有一個(gè)選項(xiàng)"總是使用UTF-8發(fā)送URL",當(dāng)該選項(xiàng)有效時(shí),IE將會(huì)對(duì)特殊字符進(jìn)行UTF-8編碼,同時(shí)進(jìn)行URL編碼。如果改選項(xiàng)無效,則使用默認(rèn)編碼"GBK",并且不進(jìn)行URL編碼。但是,對(duì)于URL后面的參數(shù),則總是不進(jìn)行編碼,相當(dāng)于UTF-8選項(xiàng)無效。比如"中文.html?a=中文",當(dāng)UTF-8選項(xiàng)有效時(shí),將發(fā)送鏈接"%e4%b8%ad%e6%96%87.html?a=\x4e\x2d\x65\x87";而UTF-8選項(xiàng)無效時(shí),將發(fā)送鏈接"\x4e\x2d\x65\x87.html?a=\x4e\x2d\x65\x87"。注意后者前面的"中文"兩個(gè)字只有4個(gè)字節(jié),而前者卻有18個(gè)字節(jié),這主要時(shí)URL編碼的原因。 

          當(dāng)web server(tomcat)接收到該鏈接時(shí),將會(huì)進(jìn)行URL解碼,即去掉"%",同時(shí)按照ISO8859-1編碼(上面已經(jīng)描述,可以使用URLEncoding來設(shè)置成其它編碼)識(shí)別。上述例子的結(jié)果分別是"\ue4\ub8\uad\ue6\u96\u87.html?a=\u4e\u2d\u65\u87"和"\u4e\u2d\u65\u87.html?a=\u4e\u2d\u65\u87",注意前者前面的"中文"兩個(gè)字恢復(fù)成了6個(gè)字符。這里用"\u",表示是unicode。 

          所以,由于客戶端設(shè)置的不同,相同的鏈接,在服務(wù)器上得到了不同結(jié)果。這個(gè)問題不少人都遇到,卻沒有很好的解決辦法。所以有的網(wǎng)站會(huì)建議用戶嘗試關(guān)閉UTF-8選項(xiàng)。不過,下面會(huì)描述一個(gè)更好的處理辦法。 

          5.2. rewrite 

          熟悉的人都知道,apache有一個(gè)功能強(qiáng)大的rewrite模塊,這里不描述其功能。需要說明的是該模塊會(huì)自動(dòng)將URL解碼(去除%),即完成上述web server(tomcat)的部分功能。有相關(guān)文檔介紹說可以使用[NE]參數(shù)來關(guān)閉該功能,但我試驗(yàn)并未成功,可能是因?yàn)榘姹荆ㄎ沂褂玫氖莂pache 2.0.54)問題。另外,當(dāng)參數(shù)中含有"?& "等符號(hào)的時(shí)候,該功能將導(dǎo)致系統(tǒng)得不到正常結(jié)果。 

          rewrite本身似乎完全是采用字節(jié)處理的方式,而不考慮字符串的編碼,所以不會(huì)帶來編碼問題。 

          5.3. URLEncode.encode() 

          這是Java本身提供對(duì)的URL編碼函數(shù),完成的工作和上述UTF-8選項(xiàng)有效時(shí)瀏覽器所做的工作相似。值得說明的是,java已經(jīng)不贊成不指定編碼來使用該方法(deprecated)。應(yīng)該在使用的時(shí)候增加編碼指定。 

          當(dāng)不指定編碼的時(shí)候,該方法使用系統(tǒng)默認(rèn)編碼,這會(huì)導(dǎo)致軟件運(yùn)行結(jié)果得不確定。比如對(duì)于"中文",當(dāng)系統(tǒng)默認(rèn)編碼為"gb2312"時(shí),結(jié)果是"%4e%2d%65%87",而默認(rèn)編碼為"UTF-8",結(jié)果卻是"%e4%b8%ad%e6%96%87",后續(xù)程序?qū)㈦y以處理。另外,這兒說的系統(tǒng)默認(rèn)編碼是由運(yùn)行tomcat時(shí)的環(huán)境變量LC_ALL和LANG等決定的,曾經(jīng)出現(xiàn)過tomcat重啟后就出現(xiàn)亂碼的問題,最后才郁悶的發(fā)現(xiàn)是因?yàn)樾薷男薷牧诉@兩個(gè)環(huán)境變量。 

          建議統(tǒng)一指定為"UTF-8"編碼,可能需要修改相應(yīng)的程序。 

          5.4. 一個(gè)解決方案 

          上面說起過,因?yàn)闉g覽器設(shè)置的不同,對(duì)于同一個(gè)鏈接,web server收到的是不同內(nèi)容,而軟件系統(tǒng)有無法知道這中間的區(qū)別,所以這一協(xié)議目前還存在缺陷。 

          針對(duì)具體問題,不應(yīng)該僥幸認(rèn)為所有客戶的IE設(shè)置都是UTF-8有效的,也不應(yīng)該粗暴的建議用戶修改IE設(shè)置,要知道,用戶不可能去記住每一個(gè)web server的設(shè)置。所以,接下來的解決辦法就只能是讓自己的程序多一點(diǎn)智能:根據(jù)內(nèi)容來分析編碼是否UTF-8。 

          比較幸運(yùn)的是UTF-8編碼相當(dāng)有規(guī)律,所以可以通過分析傳輸過來的鏈接內(nèi)容,來判斷是否是正確的UTF-8字符,如果是,則以UTF-8處理之,如果不是,則使用客戶默認(rèn)編碼(比如"GBK"),下面是一個(gè)判斷是否UTF-8的例子,如果你了解相應(yīng)規(guī)律,就容易理解。 

          public static boolean isValidUtf8(byte[] b,int aMaxCount){ 

                 int lLen=b.length,lCharCount=0; 

                 for(int i=0;i<lLen && lCharCount<aMaxCount;++lCharCount){ 

                        byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;) 

                        if(lByte>=0) continue;//>=0 is normal ascii 

                        if(lByte<(byte)0xc0 || lByte>(byte)0xfd) return false; 

                        int lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8?4 

                               :lByte>(byte)0xf0?3:lByte>(byte)0xe0?2:1; 

                        if(i+lCount>lLen) return false; 

                        for(int j=0;j<lCount;++j,++i) if(b[i]>=(byte)0xc0) return false; 

                 } 

                 return true; 



          相應(yīng)地,一個(gè)使用上述方法的例子如下: 

          public static String getUrlParam(String aStr,String aDefaultCharset) 

          throws UnsupportedEncodingException{ 

                 if(aStr==null) return null; 

                 byte[] lBytes=aStr.getBytes("ISO-8859-1"); 

                 return new String(lBytes,StringUtil.isValidUtf8(lBytes)?"utf8":aDefaultCharset); 



          不過,該方法也存在缺陷,如下兩方面: 

          l 沒有包括對(duì)用戶默認(rèn)編碼的識(shí)別,這可以根據(jù)請(qǐng)求信息的語言來判斷,但不一定正確,因?yàn)槲覀冇袝r(shí)候也會(huì)輸入一些韓文,或者其他文字。 

          l 可能會(huì)錯(cuò)誤判斷UTF-8字符,一個(gè)例子是"學(xué)習(xí)"兩個(gè)字,其GBK編碼是" \xd1\xa7\xcf\xb0",如果使用上述isValidUtf8方法判斷,將返回true。可以考慮使用更嚴(yán)格的判斷方法,不過估計(jì)效果不大。 

          有一個(gè)例子可以證明google也遇到了上述問題,而且也采用了和上述相似的處理方法,比如,如果在地址欄中輸入"http://www.google.com/search?hl=zh-CN&newwindow=1&q=學(xué)習(xí)",google將無法正確識(shí)別,而其他漢字一般能夠正常識(shí)別。 

          最后,應(yīng)該補(bǔ)充說明一下,如果不使用rewrite規(guī)則,或者通過表單提交數(shù)據(jù),其實(shí)并不一定會(huì)遇到上述問題,因?yàn)檫@時(shí)可以在提交數(shù)據(jù)時(shí)指定希望的編碼。另外,中文文件名確實(shí)會(huì)帶來問題,應(yīng)該謹(jǐn)慎使用。 

          6. 其它 

          下面描述一些和編碼有關(guān)的其他問題。 

          6.1. SecureCRT 

          除了瀏覽器和控制臺(tái)與編碼有關(guān)外,一些客戶端也很有關(guān)系。比如在使用SecureCRT連接linux時(shí),應(yīng)該讓SecureCRT的顯示編碼(不同的session,可以有不同的編碼設(shè)置)和linux的編碼環(huán)境變量保持一致。否則看到的一些幫助信息,就可能是亂碼。 

          另外,mysql有自己的編碼設(shè)置,也應(yīng)該保持和SecureCRT的顯示編碼一致。否則通過SecureCRT執(zhí)行sql語句的時(shí)候,可能無法處理中文字符,查詢結(jié)果也會(huì)出現(xiàn)亂碼。 

          對(duì)于Utf-8文件,很多編輯器(比如記事本)會(huì)在文件開頭增加三個(gè)不可見的標(biāo)志字節(jié),如果作為mysql的輸入文件,則必須要去掉這三個(gè)字符。(用linux的vi保存可以去掉這三個(gè)字符)。一個(gè)有趣的現(xiàn)象是,在中文windows下,創(chuàng)建一個(gè)新txt文件,用記事本打開,輸入"連通"兩個(gè)字,保存,再打開,你會(huì)發(fā)現(xiàn)兩個(gè)字沒了,只留下一個(gè)小黑點(diǎn)。 

          6.2. 過濾器 

          如果需要統(tǒng)一設(shè)置編碼,則通過filter進(jìn)行設(shè)置是個(gè)不錯(cuò)的選擇。在filter class中,可以統(tǒng)一為需要的請(qǐng)求或者回應(yīng)設(shè)置編碼。參加上述setCharacterEncoding()。這個(gè)類apache已經(jīng)給出了可以直接使用的例子SetCharacterEncodingFilter。 

          6.3. POST和GET 

          很明顯,以POST提交信息時(shí),URL有更好的可讀性,而且可以方便的使用setCharacterEncoding()來處理字符集問題。但GET方法形成的URL能夠更容易表達(dá)網(wǎng)頁的實(shí)際內(nèi)容,也能夠用于收藏。 

          從統(tǒng)一的角度考慮問題,建議采用GET方法,這要求在程序中獲得參數(shù)是進(jìn)行特殊處理,而無法使用setCharacterEncoding()的便利,如果不考慮rewrite,就不存在IE的UTF-8問題,可以考慮通過設(shè)置URIEncoding來方便獲取URL中的參數(shù)。 

          6.4. 簡(jiǎn)繁體編碼轉(zhuǎn)換 

          GBK同時(shí)包含簡(jiǎn)體和繁體編碼,也就是說同一個(gè)字,由于編碼不同,在GBK編碼下屬于兩個(gè)字。有時(shí)候,為了正確取得完整的結(jié)果,應(yīng)該將繁體和簡(jiǎn)體進(jìn)行統(tǒng)一。可以考慮將UTF、GBK中的所有繁體字,轉(zhuǎn)換為相應(yīng)的簡(jiǎn)體字,BIG5編碼的數(shù)據(jù),也應(yīng)該轉(zhuǎn)化成相應(yīng)的簡(jiǎn)體字。當(dāng)然,仍舊以UTF編碼存儲(chǔ)。 

          例如,對(duì)于"語言 ?言",用UTF表示為"\xE8\xAF\xAD\xE8\xA8\x80 \xE8\xAA\x9E\xE8\xA8\x80",進(jìn)行簡(jiǎn)繁體編碼轉(zhuǎn)換后應(yīng)該是兩個(gè)相同的 "\xE8\xAF\xAD\xE8\xA8\x80>"。 

           

          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1145171

          posted @ 2007-04-03 23:33 crazy zerlot 閱讀(457) | 評(píng)論 (2)編輯 收藏

          僅列出標(biāo)題
          共3頁: 上一頁 1 2 3 
          主站蜘蛛池模板: 从化市| 厦门市| 黑龙江省| 新乡市| 澄迈县| 浦东新区| 佛冈县| 鄂尔多斯市| 沙坪坝区| 古浪县| 富顺县| 绿春县| 钦州市| 亳州市| 康保县| 九龙城区| 永平县| 三门县| 景宁| 那坡县| 海兴县| 来凤县| 阿鲁科尔沁旗| 庆城县| 德安县| 阿坝| 垣曲县| 大足县| 织金县| 花莲市| 容城县| 苍山县| 米泉市| 抚宁县| 澄城县| 綦江县| 伊金霍洛旗| 罗源县| 灯塔市| 霍城县| 德保县|