听人说“Unicode就是一种编码方式”。我们调用MessageBoxA的时候传入非unicode编码的汉字,不还是一样在汉字操作系统上正常显示?而同样的程序要是拿到英文操作系统上就不能显示出汉字。而显示归显示,调用函数的时候在什么操作系统上传入的二进制流不会变!可是为什么中文操作系统就能够把一串#0结尾的字符中是中文编码的显示出来?因为它有解析相应文字ascii code的字库?比如“大”这个汉字是#96#96,那么当中文操作系统遇到#96#96的时候,是解析成"aa"还是“大”?这样问可能有点幼稚,我想当初给任何语言的文字分配字符编码的时候,都会考虑到这样的“二义性”。那么是不是多字节文字的ascii codes 的第一个字节不会是可显示字符?如果是这样,那么unicode就没用了。因为即便是用了MessageBoxW,传入了Unicode编码的汉字字符串,那么到纯英文操作系统上就能显示汉字了?不是白白增加了拉丁字母的编码长度?真搞不懂unicode是啥,还望赐教!!

解决方案 »

  1.   

    Unicode编码的汉字字符串占两个字节,而且每个字节的值都大于127($7F),即二进制最高位为1,而英文字母和数字等ASCC码中含有的字符的二进制最高位为0,所以系统在认字时判断二进制最高位,如果为1,则读两位,反之一位,不会混淆。还有就是“大”的编码不是#96#96,而是#180#243($B4F3)
    var
      s: string;
    begin
      s := '大';
      showmessage(inttostr(ord(s[1])) + inttostr(ord(s[2])));
    end;
      

  2.   

    如NTFS计算机内的存储方式是就是UNICODE的,UNICODE里每个字*(包括中英文都为2字节,)这样就有,65536个字符可以存储,非UNICODE的即,ASICC码的话只有255个字符好存储
      

  3.   

    操作系统默认的语言是英文。所以中文环境的操作系统能够正确显示英文系统。
    不同的操作系统有不同的解释。如果你定义为Unicode,到中文上显示的是乱码(因为无法解释)
      

  4.   

    厉害。。我只知道他是WIN 为了解决语言问题的。现在明白点了。。
      

  5.   


     
     
      Unicode编码的汉字字符串占两个字节,而且每个字节的值都大于127($7F),即二进制最高位为1,而英文字母和数字等ASCC码中含有的字符的二进制最高位为0.
      

  6.   

    Unicode编码的汉字字符串占两个字节,而且每个字节的值都大于127($7F),即二进制最高位为1,而英文字母和数字等ASCC码中含有的字符的二进制最高位为0.
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    这个理解是错误的。标准ASC码是7bit的,只有0~127,扩展ASC码是8bit的 0~255,扩展的部分很多国家都不同。
    unicode并非都大于127,unicode有几个标准,其中16bit标准的因为CPU寻址方式的不同,分为Big Endian 和 Little Endian,说白了就是高位在前还是低位在前的问题。
    为了区别文本文件,unicode文本文件采用了0xfffe和oxfeff来却别和标示unicode文本的类型。
    对于Big Endian(0xfeff)的Unicode 对ASC的扩展方式 采用00xx的方式,xx为原来的ASC码。
    非00开头的可以认为就不是ASC码,也就是我们常用来区分中西文的一个方式(当然这个方式不完全对)。同一段Unicode文本,在intel x86计算机里面的排列方式和 PowerPC 或者 MIPS完全相反,这个在处理跨平台程序的时候非常重要,需要交换字节的高位和低位才行。
      

  7.   

    “大”的unicode (Big Endian)是0x5957,可以看到2个字节都没有大约0x7f。
    具体的大家可以参考2000和xp的字符映射表 里面的unicode内容
    在 程序-〉附件-〉系统工具-〉字符映射表
      

  8.   

    如果这样,那么Unicode似乎没用:假设要表示“a大”
    用ascii方式使用#96#180#243,而用unicode方式要使用#0#96#180#243,两前者都可以令汉字无误地显示出来,而后者比前者多一个字节,这是何苦呢?况且,能否显示正确,在于是否有字库,根本不在于你怎么编码,#96#180#243还不是照样能显示"a大"??
      

  9.   

    我就是不明白为什么要发明unicode,因为按照我上面的说法,用多字节显示非latin文字,latin文字就按单字节存储,只要没有“二义性”,为什么不可以?况且只要双字节文字第一个字节是某些控制字符(例如不是128-156),即便后面的字节是0-256任何一个,都能避免二义性。要是嫌127*256个组合不够用,那么完全可以三字节,N字节来定义全世界的字符集阿!
      

  10.   

    如果这样,那么Unicode似乎没用:假设要表示“a大”
    用ascii方式使用#96#180#243,而用unicode方式要使用#0#96#180#243,两前者都可以令汉字无误地显示出来,而后者比前者多一个字节,这是何苦呢?况且,能否显示正确,在于是否有字库,根本不在于你怎么编码,#96#180#243还不是照样能显示"a大"??我就是不明白为什么要发明unicode,因为按照我上面的说法,用多字节显示非latin文字,latin文字就按单字节存储,只要没有“二义性”,为什么不可以?况且只要双字节文字第一个字节是某些控制字符(例如不是128-156),即便后面的字节是0-256任何一个,都能避免二义性。要是嫌127*256个组合不够用,那么完全可以三字节,N字节来定义全世界的字符集阿!
      

  11.   

    "用多字节显示非latin文字,latin文字就按单字节存储"有个缺点
    var
      ws: widestring;
      s: string;
    begin
      ws := 'a大';
      s := 'a大';
    //那么s[1]he和ws[1]表示字符a,ws[2]表示字符‘大',而用s[?]怎么表示一个汉字字符呢?
    而且unicode好像就是汉字的编码。
      

  12.   

    to: dulei115你的意思是为了编程方便?我觉得微软完全可以提供这样的api:getcharacter(txt:pchar;index:cardinal):pchar;来解决提取某个文字的问题,因为既然字库能够正常显示,一定能够知道哪几个字节是一个文字。为什么非要用unicode呢?
      

  13.   

    按我说的这样做并不会带来多少inefficiency,倒是unicode方式增加了很多没用的空间,尤其是多字节文字和latin字母混排的时候。
      

  14.   

    你的意思是为了编程方便?
    /////////////////////////////////
    可以这么说象这样的例子有很多,Delphi中表示系统日期的Today 和Date,按照楼主的意思下面的三个函数都没有必要了。
    function Today: TDateTime;
    begin
      Result := Date;
    end;function Yesterday: TDateTime;
    begin
      Result := Date - 1;
    end;function Tomorrow: TDateTime;
    begin
      Result := Date + 1;
    end;而且上一贴中要的是字符(char 和 widechar),不是字符串(pchar, string, widestring)
      

  15.   

    是unicode方式增加了很多没用的空间
    ////////////////////////////////
    unicode编码是有这么一个缺点,但是绝对不会有楼主刚开始说的那个“二义性”。
      

  16.   

    to  dulei115() 你有点抬杠了!function Today: TDateTime;function Yesterday: TDateTime;function Tomorrow: TDateTime;是为了编程方便,但是创造一个api:getcharacter(txt:pchar;index:cardinal):pchar;难道不是编程方便吗?不就是比s[?]复杂一点而已,可是带来了空间的节省。
    而且上一贴中要的是字符(char 和 widechar),不是字符串(pchar, string, widestring)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    你管它是字符还是字符串?只要能显示不就可以了?我的方法是为了显示方便,如果你为了按照位置访问数据,干什么不用数组或者别的?
      

  17.   

    unicode编码是有这么一个缺点,但是绝对不会有楼主刚开始说的那个“二义性”。
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~我的方法难道有“二义性”嘛?
      

  18.   

    windows中的函数全部是一unicode作参数,函数名的,同时保留了ascii的方式,不过是一个操作系统的自动完成的功能,也就是说你调用ascii函数的同时,完成了转马和调用unicode的过程,快给分吧
      

  19.   


    ///////////////////////////////////////////
    浪费空间有时候是必须的,为了格式的统一以及由此带来的超作的方便,只有浪费空间
    没有十全十美的东东,为了得到好的结果,必须在有矛盾的几个因数中有所取舍
    ///////////////////////////////////////////
    这是句放置四海而皆准的话,如果加上ms不愿意因为Xcode的改革导致很多以前代码无法编译丢失客户,这个理由似乎更充分些。毕竟unicode产生了,它确实有存在的道理。
    可是谁又知道ms在做出这个选择的时候考虑了多少复杂的因素呢?我想这个答案在csdn找是pipe dream了。
    理非辩不能明!如果失败是真理的妈妈,那么抬杠就是真理的爸爸。当爹还能挣分,稳赚不陪的买卖!
    别着急,得让我问个明白,不够分可以加!我之所以有今天的问题是因为这另外100分!http://expert.csdn.net/Expert/topic/2844/2844394.xml?temp=.1995508
      

  20.   

    帮我up这个铁子:
    http://expert.csdn.net/Expert/topic/2844/2844394.xml?temp=.1995508up者有分!!