java反編譯利器。
http://java.decompiler.free.fr/?q=jdgui
注意:
? (1)文件名必須與類名一致,否則會失去響應
? (2)2位小數反編譯后可能會變成7、8位小數
2,WinMerge
windows下開源的文件比較工具
3,Axure RP
原型設計
posted @ 2009-11-08 23:42 leekiang 閱讀(270) | 評論 (0) | 編輯 收藏
1,JD-GUI
java反編譯利器。 http://java.decompiler.free.fr/?q=jdgui 注意: ? (1)文件名必須與類名一致,否則會失去響應 ? (2)2位小數反編譯后可能會變成7、8位小數 2,WinMerge windows下開源的文件比較工具 3,Axure RP 原型設計 posted @ 2009-11-08 23:42 leekiang 閱讀(270) | 評論 (0) | 編輯 收藏 CREATE OR REPLACE PROCEDURE p_test(ST_NUM IN NUMBER, /*起始數值*/
?????????????????????????????????? ED_NUM IN NUMBER /*結束數值*/) IS BEGIN ? declare ??? i number; ? begin ??? /*循環插入*/ ??? FOR i IN ST_NUM .. ED_NUM LOOP ????? INSERT INTO test_temp values (i, 'test'); ??? END LOOP; ? end; ? commit; ? /*異常處理*/ EXCEPTION ? WHEN OTHERS THEN ??? rollback; END; 在command window里執行call p_test(1,100); posted @ 2009-11-07 13:15 leekiang 閱讀(282) | 評論 (0) | 編輯 收藏 ????String? xml="<?xml version=\"1.0\" encoding=\"GBK\" ?><root><test>0</test></root>";
?? 應該使用Document document = saxReader.read(new ByteArrayInputStream(xml.getBytes()));? 如果使用Document?? document?? =?? saxReader.read(xml);會報no protocol 異常 如果xml的encoding="utf-8",則xml.getBytes()要改為xml.getBytes("utf-8"),否則會報錯 Element root=??document.getRootElement(); 得到root后取子元素,既可以 Element e=root.element("test"); 也可以 for (Iterator it = root.elementIterator(); it.hasNext();) { Element e = (Element) it.next(); ??? String n = e.getName(); ?? String v=e.getStringValue() } http://www.javatx.cn/clubPage.jsp?ccStyle=0&ccID=15&tID=1922 http://lavasoft.blog.51cto.com/62575/66953 posted @ 2009-10-25 18:43 leekiang 閱讀(449) | 評論 (0) | 編輯 收藏 System.setProperty("sun.net.client.defaultConnectTimeout", "3000");
?? ??? ?System.setProperty("sun.net.client.defaultReadTime ", "3000"); ?? ??? ? ?? ??? ?URL url1=null; ?? ??? ?try { ?? ??? ??? ?url1 = new URL(url); ?? ??? ??? ?HttpURLConnection urlCon = (HttpURLConnection)url1.openConnection(); ?? ??? ??? ?System.out.println(urlCon); ?? ??? ??? ? BufferedReader in = null; ?? ??? ???????? try { ?? ??? ?????????? in = new BufferedReader( ?? ??? ???????????? new InputStreamReader( ?? ??? ??????????? ??? ??? ?urlCon.getInputStream())); ?? ??? ?????????? String inputLine; ?? ??? ?????????? while ( ?? ??? ???????????? (inputLine = in.readLine()) != null) { ?? ??? ???????????? System.out.println(inputLine); ?? ??? ?????????? } ?? ??? ???????? } catch (IOException e) { ?? ??? ?????????? e.printStackTrace(); ?? ??? ???????? } ?? ??? ???????? in.close(); ?? ??? ???????? urlCon.disconnect(); ?? ??? ?} catch (Exception e1) { ?? ??? ??? ?e1.printStackTrace(); ?? ??? ?} http://tech.techweb.com.cn/archiver/tid-225522.html http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/net/HttpURLConnection.html http://zhuixue.javaeye.com/blog/385793 posted @ 2009-10-21 14:12 leekiang 閱讀(337) | 評論 (0) | 編輯 收藏
聚集(Aggregation),
組成(Composition)
整體擁有各部分,部分與整體共存,如整體不存在了,部分也會隨之消失, 這稱為組成(Composition) 。注:我覺得部分不一定會消失。 一輛轎車包含四個車輪、一個方向盤、一個發動機和一個底盤,這算不算 Composition 的例子?因為如果轎車報廢了,方向盤可能還可以用。 課題組包含許多成員,但是每個成員又可以是另一個課題組的成員,即部分可以參加多個整體,這種為聚集 我覺得組成相當于ER里的many-to-one或one-to-one,即one方只能屬于一個父親。 而聚齊相當于many-to-many,聚齊需要一張中間表。 在UML中,聚集表示為空心菱形,組成表示為實心菱形。 http://blog.csdn.net/booknut/archive/2009/03/11/3980936.aspx http://blog.myspace.cn/e/401679080.htm posted @ 2009-10-17 11:41 leekiang 閱讀(2261) | 評論 (0) | 編輯 收藏 UML的三大“硬傷”
http://www.yesky.com/112/1802612.shtml 《UML三大硬傷》的16條硬傷 http://blog.csdn.net/gigix/archive/2002/05/23/2344.aspx 從《UML的三大硬傷》說起 http://blog.csdn.net/gigix/archive/2002/05/28/2345.aspx 那么,應該怎么辦呢?我認為,在采用UML進行建模時,應該考慮到中國目前軟件人員和用戶對于UML的陌生和不解,增加他們對于UML的認識,在適當的時候進行一定的妥協,放棄其中一些確實令人迷惑的部分,只選用其中可以被人理解的部分,將結構化的分析方法和面向對象的分析方法結合起來,將UML的分析設計原則,和項目的具體情況結合起來,這樣完成的分析設計,才能夠被客戶所認同和接受,這樣完成的設計文檔,才是真正有實際意義的文檔,才可以去知道程序員進行編程. 還是那句話,軟件所反映出的矛盾和問題,其實是人與人之間的矛盾和問題,UML在美國受到廣泛歡迎,而在中國則受到懷疑,問題并不是出在UML本身上,而是出在兩個國家的環境不一樣上.套用毛主席的名言,不考慮中國的具體環境,盲目推行UML,是犯了教條主義的錯誤;而一味強調中國的特殊情況,完全拒絕,否定外國的先進經驗,則是犯了經驗主義的錯誤.UML的先進理論,必須與中國軟件發展的實際情況相結合,才能夠真正地發揚光大,發揮出越來越大的作用. posted @ 2009-10-12 13:35 leekiang 閱讀(384) | 評論 (0) | 編輯 收藏 1. 文件系統是否滿
方法: df –k 可以以K為單位檢查文件系統的使用率。(90%以上,需要調整) 2. 檢查系統出錯日志 使用errpt |more來檢查 清除現有的log: Errclear 0 3. 檢查系統合法/非法登陸情況 使用Last命令來檢查來自登陸的地方。 4. 檢查系統是否有巨大的Core文件生成 使用 find / -name core –print來檢查。對Core文件,一般直接刪除就可以了。 5. 系統性能檢查: a) CPU性能:使用Vmstat, topas來檢查 b) 內存使用情況:也是使用topas, vmstat來檢查 c) 檢查IO平衡使用情況:使用iostat來檢查 d) 交換空間使用情況:使用lsps –s來檢查 ?? 顯示交換區的分布信息? lsps -a ? ? 6.顯示卷信息: lsvg 顯示卷的名稱 lsvg -l rootvg 顯示rootvg卷的詳細信息 在AIX中運行Oracle性能方面的技巧和訣竅 AIX 性能調優 內存篇之四 調優參數 AIX 中 Paging Space 使用率過高的分析與解決 posted @ 2009-10-09 12:01 leekiang 閱讀(242) | 評論 (0) | 編輯 收藏 轉自http://developer.51cto.com/art/200907/139005.htm
這是一些分析jQuery框架的文字 ??? 針對jQuery 1.3.2版本 ??? 面向的讀者應具備以下要求 ??? 1.非常熟悉HTML ??? 2.非常熟悉javascript語法知識 ??? 3.熟悉javascript面向對象方面的知識 ??? 4.熟練使用jQuery框架 ??? 言歸正傳! ??? jQuery對象的初始化是寫在匿名函數里的 ??? 就像這樣: ??? (function(){alert("jQuery框架分析")})(); ??? 第一個括號是聲明了一個函數,第二個括號是執行這個函數。也就是說,jQuery框架在頁面載入的時候已經做了一些事情(這個個匿名函數已經被執行了)。 做的這些事情使我們可以通過$("#yourId")或$(".yourClass")等方式獲取頁面元素,并把獲取到的元素包裝成jQuery對象。 ??? 匿名函數是怎么實現這些功能的呢? ??? 首先框架定義了兩個核心對象 ??? jQuery = window.jQuery = window.$ = function( selector, context ) {} ??? 一個是jQuery ??? 一個是$ ??? 這兩個對象都指向一個函數 ??? 這個函數是我們使用$()或jQuery()方法時的入口,這個方法返回一個jQuery.fn.init( selector, context );的實例,其實這個實例是一個jQuery對象。 ??? jQuery對象是一個什么樣的對象呢? ??? jQuery對象其實是一個javascript的數組 ??? 這個數組對象包含125個方法和4個屬性 ??? 4個屬性分別是 ??? jQuery???? 當前的jQuery框架版本號 ??? length???? 指示該數組對象的元素個數 ??? context??? 一般情況下都是指向HtmlDocument對象 ??? selector?? 傳遞進來的選擇器內容? 如:#yourId或。yourClass等 ??? 如果你通過$("#yourId")方法獲取jQuery對象,并且你的頁面中只有一個id為yourId的元素那么$("#yourId")[0]就是 HtmlElement元素與document.getElementById("yourId")獲取的元素是一樣的 jQuery對象是怎么構造出來的呢? ??? 這個對象就是剛才我們提到的 ??? jQuery = window.jQuery = window.$ = function( selector, context ) {} ??? 框架不只為此對象定義了一個方法,還定義了它的原型(prototype) ??? jQueryjQuery.fn = jQuery.prototype = {//此處為json對象} ??? 原型的定義是通過json對象定義的 ??? 如 ??? { ??? init: function( selector, context ) {//方法體}, ??? jQuery: "1.3.2",//屬性 ??? size: function() {//方法體}, ??? //…… ??? } ??? 前面提到的125個方法4個屬性有一部分在這個json對象中完成定義的 這個json對象中第一個方法就是init方法也就是入口方法中的jQuery.fn.init( selector, context );此方法與一個正則表達式對象配合來構造jQuery對象 ??? 這個正則表達式為: ??? quickExpr = /^[^<]*(<(。|\s)+>)[^>]*$|^#([\w-]+)$/ ??? 下面我們說一下init方法的實現邏輯 ??? 此方法有兩個參數 ??? 一個是selector(選擇器) ??? 一個是context(上下文) ??? selector就是我們用$("#yourId")或jQuery(".yourClass")傳遞進來的變量 ??? 這個參數不一定是字符串,也可能是其他形式的變量 ??? 等會兒我們就會介紹到 ??? context參數我們在使用jQuery的時候很少用到,暫且不表 ??? 注意這兩個參數都在返回的jQuery對象中體現出來了(以兩個同名的屬性展示) ??? 下面看一下這個方法體內部的實現邏輯 ? //如果沒有選擇器或者選擇器為空的話,就把document對象賦值給他 至此 ??? var obj = $(“#yourId”); ??? 構造jQuery對象的初步工作就做完了 posted @ 2009-10-08 21:53 leekiang 閱讀(595) | 評論 (0) | 編輯 收藏 搞清常用編碼特性是解決字符集編碼問題的基礎。字符集編碼的識別與轉換、分析各種亂碼產生的原因、編程操作各種編碼字符串(例如字符數計算、截斷處理)等都需要弄清楚編碼的特性。
了解一種字符集編碼主要是要了解該編碼的編碼范圍,編碼對應的字符集(都包含哪些字符),和其他字符集編碼之間的關系等。 --------1. ASCII-------- ASCII碼是7位編碼,編碼范圍是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯數字和標點符號等字符。其中0x00-0x20和0x7F共33個控制字符。 只支持ASCII碼的系統會忽略每個字節的最高位,只認為低7位是有效位。HZ字符編碼就是早期為了在只支持7位ASCII系統中傳輸中文而設計的編碼。早期很多郵件系統也只支持ASCII編碼,為了傳輸中文郵件必須使用BASE64或者其他編碼方式。 --------2. GB2312-------- GB2312 是基于區位碼設計的,區位碼把編碼表分為94個區,每個區對應94個位,每個字符的區號和位號組合起來就是該漢字的區位碼。區位碼一般用10進制數來表 示,如1601就表示16區1位,對應的字符是"啊"。在區位碼的區號和位號上分別加上0xA0就得到了GB2312編碼。 區位碼中 01-09區是符號、數字區,16-87區是漢字區,10-15和88-94是未定義的空白區。它將收錄的漢字分成兩級:第一級是常用漢字計3755個, 置于16-55區,按漢語拼音字母/筆形順序排列;第二級漢字是次常用漢字計3008個,置于56-87區,按部首/筆畫順序排列。一級漢字是按照拼音排 序的,這個就可以得到某個拼音在一級漢字區位中的范圍,很多根據漢字可以得到拼音的程序就是根據這個原理編寫的。 GB2312字符集中除常用簡體漢字字符外還包括希臘字母、日文平假名及片假名字母、俄語西里爾字母等字符,未收錄繁體中文漢字和一些生僻字。可以用繁體漢字測試某些系統是不是只支持GB2312編碼。 GB2312的編碼范圍是0xA1A1-0x7E7E,去掉未定義的區域之后可以理解為實際編碼范圍是0xA1A1-0xF7FE。 EUC-CN可以理解為GB2312的別名,和GB2312完全相同。 區 位碼更應該認為是字符集的定義,定義了所收錄的字符和字符位置,而GB2312及EUC-CN是實際計算機環境中支持這種字符集的編碼。HZ和ISO- 2022-CN是對應區位碼字符集的另外兩種編碼,都是用7位編碼空間來支持漢字。區位碼和GB2312編碼的關系有點像 Unicode和UTF-8。 --------3. GBK-------- GBK編碼是GB2312編碼的超集,向下完全兼容 GB2312,同時GBK收錄了Unicode基本多文種平面中的所有CJK漢字。同 GB2312一樣,GBK也支持希臘字母、日文假名字母、俄語字母等字符,但不支持韓語中的表音字符(非漢字字符)。GBK還收錄了GB2312不包含的 漢字部首符號、豎排標點符號等字符。 GBK的整體編碼范圍是為0x8140-0xFEFE,不包括低字節是0×7F的組合。高字節范圍是0×81-0xFE,低字節范圍是0x40-7E和0x80-0xFE。 低字節是0x40-0x7E的GBK字符有一定特殊性,因為這些字符占用了ASCII碼的位置,這樣會給一些系統帶來麻煩。 有 些系統中用0x40-0x7E中的字符(如"|")做特殊符號,在定位這些符號時又沒有判斷這些符號是不是屬于某個 GBK字符的低字節,這樣就會造成錯誤判斷。在支持GB2312的環境下就不存在這個問題。需要注意的是支持GBK的環境中小于0x80的某個字節未必就 是ASCII符號;另外就是最好選用小于0×40的ASCII符號做一些特殊符號,這樣就可以快速定位,且不用擔心是某個漢字的另一半。Big5編碼中也 存在相應問題。 CP936和GBK的有些許差別,絕大多數情況下可以把CP936當作GBK的別名。 --------4. GB18030-------- GB18030編碼向下兼容GBK和GB2312,兼容的含義是不僅字符兼容,而且相同字符的編碼也相同。GB18030收錄了所有Unicode3.1中的字符,包括中國少數民族字符,GBK不支持的韓文字符等等,也可以說是世界大多民族的文字符號都被收錄在內。 GBK和GB2312都是雙字節等寬編碼,如果算上和ASCII兼容所支持的單字節,也可以理解為是單字節和雙字節混合的變長編碼。GB18030編碼是變長編碼,有單字節、雙字節和四字節三種方式。 GB18030 的單字節編碼范圍是0x00-0x7F,完全等同與ASCII;雙字節編碼的范圍和GBK相同,高字節是0x81-0xFE,低字節的編碼范圍是 0x40-0x7E和0x80-FE;四字節編碼中第一、三字節的編碼范圍是0x81-0xFE,二、四字節是0x30-0x39。 Windows 中CP936代碼頁使用0x80來表示歐元符號,而在GB18030編碼中沒有使用0x80編碼位,用其他位置來表示歐元符號。這可以理解為是 GB18030向下兼容性上的一點小問題;也可以理解為0x80是CP936對GBK的擴展,而GB18030只是和GBK兼容良好。 --------5. BIG5-------- Big5是雙字節編碼,高字節編碼范圍是0x81-0xFE,低字節編碼范圍是0x40-0x7E和0xA1-0xFE。和GBK相比,少了低字節是0x80-0xA0的組合。0x8140-0xA0FE是保留區域,用于用戶造字區。 Big5 收錄的漢字只包括繁體漢字,不包括簡體漢字,一些生僻的漢字也沒有收錄。GBK收錄的日文假名字符、俄文字符Big5也沒有收錄。因為Big5當中收錄的 字符有限,因此有很多在Big5基礎上擴展的編碼,如倚天中文系統。Windows系統上使用的代碼頁CP950也可以理解為是對Big5的擴展,在 Big5的基礎上增加了7個漢字和一些符號。Big5編碼對應的字符集是GBK字符集的子集,也就是說Big5收錄的字符是GBK收錄字符的一部分,但相 同字符的編碼不同。 因為Big5也占用了ASCII的編碼空間(低字節所使用的0x40-0x7E),所以Big5編碼在一些環境下存在和 GBK編碼相同的問題,即低字節范圍為0x40-0x7E的字符有可能會被誤處理,尤其是低字節是0x5C("/")和0x7C("|")的字符。可以參 考GBK一節相應說明。 盡管有些區別,大多數情況下可以把CP950當作Big5的別名。 --------6. ISO-8859-1-------- ISO-8859-1編碼是單字節編碼,向下兼容ASCII,其編碼范圍是0x00-0xFF,0x00-0x7F之間完全和ASCII一致,0x80-0x9F之間是控制字符,0xA0-0xFF之間是文字符號。 ISO-8859-1收錄的字符除ASCII收錄的字符外,還包括西歐語言、希臘語、泰語、阿拉伯語、希伯來語對應的文字符號。歐元符號出現的比較晚,沒有被收錄在ISO-8859-1當中。 因 為ISO-8859-1編碼范圍使用了單字節內的所有空間,在支持ISO-8859-1的系統中傳輸和存儲其他任何編碼的字節流都不會被拋棄。換言之,把 其他任何編碼的字節流當作ISO-8859-1編碼看待都沒有問題。這是個很重要的特性,MySQL數據庫默認編碼是Latin1就是利用了這個特性。 ASCII編碼是一個7位的容器,ISO-8859-1編碼是一個8位的容器。 Latin1是ISO-8859-1的別名,有些環境下寫作Latin-1。 --------7. UCS-2和UTF-16-------- Unicode 組織和ISO組織都試圖定義一個超大字符集,目的是要涵蓋所有語言使用的字符以及其他學科使用的一些特殊符號,這個字符集就是通用字符集 (UCS,Universal Character Set)。這兩個組織經過協調,雖然在各自發展,但定義的字符位置是完全一致的。ISO相應的標準是ISO 10646。Unicode和ISO 10646都在不斷的發展過程中,所以會有不同的版本號來標明不同的發展階段,每個Unicode版本號都能找到相對應的ISO 10646版本號。 ISO 10646標準定義了一個31位的字符集。前兩個字節的位置(0x0000-0xFFFD)被稱為基本多語言面(Basic Multilingual Plane, BMP),超出兩個字節的范圍稱作輔助語言面。BMP基本包括了所有語言中絕大多數字符,所以只要支持BMP就可以支持絕大多數場合下的應用。 Unicode 3.0對應的字符集在BMP范圍內。 UCS字符集為每個字符分配了一個位置,通常用"U"再加上某個字符在UCS中位置的16進制數作為這個字符的UCS表示,例如"U+0041"表示字符"A"。UCS字符U+0000到U+00FF與ISO-8859-1完全一致。 UCS- 2、UTF-16是UCS字符集(或者說是Unicode字符集)實際應用中的具體編碼方式。UCS-2是兩個字節的等寬編碼,因為只是使用了兩個字節的 編碼空間,所以只能對BMP中的字符做編碼。UTF-16是變長編碼,用兩個字節對BMP內的字符編碼,用4個字節對超出BMP范圍的輔助平面內的字符作 編碼。 UCS-2不同于GBK和Big5,它是真正的等寬編碼,每個字符都使用兩個字節,這個特性在字符串截斷和字符數計算時非常方便。 UTF-16是UCS-2的超集,UTF-16編碼的兩字節編碼方式完全和UCS-2相同,也就是說在BMP的框架內UCS-2完全等同與UTF-16。實際情況當中常常把UTF-16當作UCS-2的別名。 UCS- 2和UTF-16在存儲和傳輸時會使用兩種不同的字節序,分別是big endian和little endian(大尾和小尾)。例如"啊"(U+554A)用big endian表示就是0x554A,用little endian表示就是0x4A55。UCS-2和UTF-16默認的字節序是big endian方式。在傳輸過程中為了說明字節序需要在字節流前加上BOM(Byte order Mark),0xFEFF表示是big endian,0xFFFE表示是little endian。UCS-2BE、UCS-2LE是實際應用中使用的編碼名稱,對應著big endian和little endian,UTF-16BE、UTF-16LE也是如此。因為默認是BE字節序,所以可以把UCS-2當做是UCS-2BE的別名。 在 UCS編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的編碼是U+FEFF,是個沒有實際意義的字符。UCS規范建議我們在傳輸字節流前,先傳輸字符"ZERO WIDTH NO-BREAK SPACE",如果傳輸的ZERO WIDTH NO-BREAK SPACE是0xFEFF就說明是big endian,反之就是little endian。 UCS-2和UTF-16也可以理解為和ASCII以及ISO-8859-1兼容,在ASCII編碼或者ISO-8859-1編碼的每個字節前加上0x00,就得到相應字符的UCS-2編碼。 UCS-2和UTF-16中會使用0x00作為某個字符編碼的一部分,某些系統會把0x00當作字符串結束的標志,在處理UCS-2或UTF-16編碼時會出現問題。 --------8. UTF-8-------- UTF-8是UCS字符集的另一種編碼方式,UTF-16的每個單元是兩個字節(16位),而UTF-8的每個單元是一個字節(8位)。UTF-16中用一個或兩個雙字節表示一個字符,UTF-8中用一個或幾個單字節表示一個字符。 可以認為UTF-8編碼是根據一定規律從UCS-2轉換得到的,從UCS-2到UTF-8之間有以下轉換關系: UCS-2 UTF-8 U+0000 - U+007F 0xxxxxxx U+0080 - U+07FF 110xxxxx 10xxxxxx U+0800 - U+FFFF 1110xxxx 10xxxxxx 10xxxxxx 例如"啊"字的UCS-2編碼是0x554A,對應的二進制是0101 0101 0100 1010,轉成UTF-8編碼之后的二進制是1110 0101 10 010101 10 001010,對應的十六進制是0xE5958A。 UCS- 4也是一種UCS字符集的編碼方式,是使用4個字節的等寬編碼,可以用UCS-4來表示BMP之外的輔助面字符。UCS-2中每兩個字節前再加上 0x0000就得到了BMP字符的UCS-4編碼。從UCS-4到UTF-8也存在轉換關系,根據這種轉換關系,UTF-8最多可以使用六個字節來編碼 UCS-4。 根據UTF-8的生成規律和UCS字符集的特性,可以看到UTF-8具有的特性: UTF-8完全和ASCII兼容,也就是說ASCII對應的字符在UTF-8中和ASCII編碼完全一致。范圍在0x00-0x7F之內的字符一定是ASCII字符,不可能是其他字符的一部分。GBK和Big5都存在的缺陷在UTF-8中是不存在的。 大于U+007F的UCS字符,在UTF-8編碼中至少是兩個字節。 UTF-8中的每個字符編碼的首字節總在0x00-0xFD之間(不考慮UCS-4支持的情況,首字節在0x00-0xEF之間)。根據首字節就可以判斷之后連續幾個字節。 非首字節的其他字節都在0x80-0xBF之間;0xFE和0xFF在UTF-8中沒有被用到。 GBK編碼中的漢字字符都在UCS-2中的范圍都在U+0800 - U+FFFF之間,所以每個GBK編碼中的漢字字符的UTF-8編碼都是3個字節。但GBK中包含的其他字符的UTF-8編碼就不一定是3個字節了,如GBK中的俄文字符。 在UTF-8的編碼的傳輸過程中即使丟掉一個字節,根據編碼規律也很容易定位丟掉的位置,不會影響到其他字符。在其他雙字節編碼中,一旦損失一個字節,就會影響到此字節之后的所有字符。從這點可以看出UTF-8編碼非常適合作為傳輸編碼! 出處:http://i.cn.yahoo.com/07609654986/blog/p_14/ posted @ 2009-10-08 17:55 leekiang 閱讀(534) | 評論 (1) | 編輯 收藏 為了統一全世界各國語言文字和專業領域符號(例如數學符號、樂譜符號)的編碼,ISO制定了ISO 10646標準,也稱為UCS(Universal Character Set)。UCS編碼的長度是31位,可以表示231個字符。如果兩個字符編碼的高位相同,只有低16位不同,則它們屬于一個平面(Plane),所以一個平面由216個字符組成。目前常用的大部分字符都位于第一個平面(編碼范圍是U-00000000~U-0000FFFD),稱為BMP(Basic Multilingual Plane)或Plane 0,為了向后兼容,其中編號為0~256的字符和Latin-1相同。UCS編碼通常用U-xxxxxxxx這種形式表示,而BMP的編碼通常用 U+xxxx這種形式表示,其中x是十六進制數字。在ISO制定UCS的同時,另一個由廠商聯合組織也在著手制定這樣的編碼,稱為Unicode,后來兩家聯手制定統一的編碼,但各自發布各自的標準文檔,所以UCS編碼和Unicode碼是相同的。 有了字符編碼,另一個問題就是這樣的編碼在計算機中怎么表示。現在已經不可能用一個字節表示一個字符了,最直接的想法就是用四個字節表示一個字符,這種表示方法稱為UCS-4或UTF-32,UTF是Unicode Transformation Format的縮寫。一方面這樣比較浪費存儲空間,由于常用字符都集中在BMP,高位的兩個字節通常是0,如果只用ASCII碼或Latin-1,高位的三個字節都是0。另一種比較節省存儲空間的辦法是用兩個字節表示一個字符,稱為UCS-2或UTF-16,這樣只能表示BMP中的字符,但BMP中有一些擴展字符,可以用兩個這樣的擴展字符表示其它平面的字符,稱為Surrogate Pair。無論是UTF-32還是UTF-16都有一個更嚴重的問題是和C語言不兼容,在C語言中0字節表示字符串結尾,庫函數 UNIX之父Ken Thompson提出的UTF-8編碼很好地解決了這些問題,現在得到廣泛應用。UTF-8具有以下性質:
具體來說,UTF-8編碼有以下幾種格式: U-00000000?–?U-0000007F:? 0xxxxxxx 第 一個字節要么最高位是0(ASCII字節),要么最高兩位都是1,最高位之后1的個數決定后面有多少個字節也屬于當前字符編碼,例如111110xx,最 高位之后還有四個1,表示后面有四個字節也屬于當前字符的編碼。后面每個字節的最高兩位都是10,可以和第一個字節區分開。這樣的設計有利于誤碼同步,例 如在網絡傳輸過程中丟失了幾個字節,很容易判斷當前字符是不完整的,也很容易找到下一個字符從哪里開始,結果頂多丟掉一兩個字符,而不會導致后面的編碼解 釋全部混亂了。上面的格式中標為x的位就是UCS編碼,最后一種6字節的格式中x位有31個,可以表示31位的UCS編碼,UTF-8就像一列火車,第一 個字節是車頭,后面每個字節是車廂,其中承載的貨物是UCS編碼。UTF-8規定承載的UCS編碼以大端表示,也就是說第一個字節中的x是UCS編碼的高 位,后面字節中的x是UCS編碼的低位。 例如U+00A9(?字符)的二進制是10101001,編碼成UTF-8是11000010 10101001(0xC2 0xA9),但不能編碼成11100000 10000010 10101001,UTF-8規定每個字符只能用盡可能少的字節來編碼。 來源:http://learn.akae.cn/media/apas02.html posted @ 2009-10-08 17:31 leekiang 閱讀(300) | 評論 (0) | 編輯 收藏 |
||