MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

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 阅读(256) | 评论 (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 阅读(271) | 评论 (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 阅读(432) | 评论 (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 阅读(315) | 评论 (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 阅读(2238) | 评论 (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 阅读(360) | 评论 (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 阅读(213) | 评论 (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对象赋值给他
selector = selector || document;
//如果selector参数是dom元素,直接返回jQuery对象
//也就是说你可以$(document.getElementById("allen"))把你的元素封装成jQuery对象
if ( selector.nodeType ) {
this[0] = selector;
this.length = 1;
this.context = selector;
return this;
}
//typeof 取对象的类型,用三个等号效率较高, 不需要类型转换,两个等号默认有类型转换
if ( typeof selector === "string" ) {
//这里用到了我们前面提到的正则表达式quickExpr
//match其实是一个数组
//第0个元素是与正则表达式相匹配的文本
//第1个元素是与正则表达式的第1个子表达式相匹配的文本(如果有的话)
//第2个元素是第2个子表达式相匹配的文本(如果有的话)
//第3个元素是第3个子表达式相匹配的文本(如果有的话)这里就是元素的ID,不包含#
var match = quickExpr.exec( selector );
//正则表达式匹配到了内容   并且 match[1]不为空 或者 context为空
//match[1]不为空的时候selector是HTML字符串,也就是你可以用$("
xland
")把对象包装成jQuery对象
//context为空的时候selector是页面元素ID
if ( match && (match[1] || !context) ) {
 //选择器为html字符串  此情况暂且不表
if ( match[1] ){
selector = jQuery.clean( [ match[1] ], context );}
//选择器为ID
else {
//得到元素
var elem = document.getElementById( match[3] );
 //如果得到了这个元素但是元素的ID属性不是match[3],跳入分支。分支里面的东西做了什么工作,暂且不表
if ( elem && elem.id != match[3] ){
return jQuery().find( selector );}
//把得到的页面元素封装成jQuery对象
//如果elem为空,就传入一个空数组,框架怎么处理此空数组,暂且不表
//如果不为空就跳入我们前面说的if ( selector.nodeType )分支,构造出jQuery对象来
var ret = jQuery( elem || [] );
 //设置jQuery对象的context属性
ret.context = document;
 //设置jQuery对象的selector属性
ret.selector = selector;
 //返回这个对象给调用者
return ret;
}

至此

    var obj = $(“#yourId”);

    构造jQuery对象的初步工作就做完了



posted @ 2009-10-08 21:53 leekiang 阅读(574) | 评论 (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 阅读(514) | 评论 (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字节表示字符串结尾,库函数strlenstrcpy等等都依赖于这一点,如果字符串用UTF-32存储,其中有很多0字节并不表示字符串结尾,这就乱套了。

UNIX之父Ken Thompson提出的UTF-8编码很好地解决了这些问题,现在得到广泛应用。UTF-8具有以下性质:

  • 编码为U+0000~U+007F的字符只占一个字节,就是0x00~0x7F,和ASCII码兼容。

  • 编码大于U+007F的字符用2~6个字节表示,每个字节的最高位都是1,而ASCII码的最高位都是0,因此非ASCII码字符的表示中不会出现ASCII码字节(也就不会出现0字节)。

  • 用于表示非ASCII码字符的多字节序列中,第一个字节的取值范围是0xC0~0xFD,根据它可以判断后面有多少个字节也属于当前字符的编码。后面每个字节的取值范围都是0x80~0xBF,见下面的详细说明。

  • UCS定义的所有231个字符都可以用UTF-8编码表示出来。

  • UTF-8编码最长6个字节,BMP字符的UTF-8编码最长三个字节。

  • 0xFE和0xFF这两个字节在UTF-8编码中不会出现。

具体来说,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

第 一个字节要么最高位是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 阅读(282) | 评论 (0)编辑 收藏

仅列出标题
共54页: First 上一页 20 21 22 23 24 25 26 27 28 下一页 Last