听人说“Unicode就是一种编码方式”。我们调用MessageBoxA的时候传入非unicode编码的汉字,不还是一样在汉字操作系统上正常显示?而同样的程序要是拿到英文操作系统上就不能显示出汉字。而显示归显示,调用函数的时候在什么操作系统上传入的二进制流不会变!可是为什么中文操作系统就能够把一串#0结尾的字符中是中文编码的显示出来?因为它有解析相应文字ascii code的字库?比如“大”这个汉字是#96#96,那么当中文操作系统遇到#96#96的时候,是解析成"aa"还是“大”?这样问可能有点幼稚,我想当初给任何语言的文字分配字符编码的时候,都会考虑到这样的“二义性”。那么是不是多字节文字的ascii codes 的第一个字节不会是可显示字符?如果是这样,那么unicode就没用了。因为即便是用了MessageBoxW,传入了Unicode编码的汉字字符串,那么到纯英文操作系统上就能显示汉字了?不是白白增加了拉丁字母的编码长度?真搞不懂unicode是啥,还望赐教!!
var
s: string;
begin
s := '大';
showmessage(inttostr(ord(s[1])) + inttostr(ord(s[2])));
end;
不同的操作系统有不同的解释。如果你定义为Unicode,到中文上显示的是乱码(因为无法解释)
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完全相反,这个在处理跨平台程序的时候非常重要,需要交换字节的高位和低位才行。
具体的大家可以参考2000和xp的字符映射表 里面的unicode内容
在 程序-〉附件-〉系统工具-〉字符映射表
用ascii方式使用#96#180#243,而用unicode方式要使用#0#96#180#243,两前者都可以令汉字无误地显示出来,而后者比前者多一个字节,这是何苦呢?况且,能否显示正确,在于是否有字库,根本不在于你怎么编码,#96#180#243还不是照样能显示"a大"??
用ascii方式使用#96#180#243,而用unicode方式要使用#0#96#180#243,两前者都可以令汉字无误地显示出来,而后者比前者多一个字节,这是何苦呢?况且,能否显示正确,在于是否有字库,根本不在于你怎么编码,#96#180#243还不是照样能显示"a大"??我就是不明白为什么要发明unicode,因为按照我上面的说法,用多字节显示非latin文字,latin文字就按单字节存储,只要没有“二义性”,为什么不可以?况且只要双字节文字第一个字节是某些控制字符(例如不是128-156),即便后面的字节是0-256任何一个,都能避免二义性。要是嫌127*256个组合不够用,那么完全可以三字节,N字节来定义全世界的字符集阿!
var
ws: widestring;
s: string;
begin
ws := 'a大';
s := 'a大';
//那么s[1]he和ws[1]表示字符a,ws[2]表示字符‘大',而用s[?]怎么表示一个汉字字符呢?
而且unicode好像就是汉字的编码。
/////////////////////////////////
可以这么说象这样的例子有很多,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)
////////////////////////////////
unicode编码是有这么一个缺点,但是绝对不会有楼主刚开始说的那个“二义性”。
而且上一贴中要的是字符(char 和 widechar),不是字符串(pchar, string, widestring)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
你管它是字符还是字符串?只要能显示不就可以了?我的方法是为了显示方便,如果你为了按照位置访问数据,干什么不用数组或者别的?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~我的方法难道有“二义性”嘛?
///////////////////////////////////////////
浪费空间有时候是必须的,为了格式的统一以及由此带来的超作的方便,只有浪费空间
没有十全十美的东东,为了得到好的结果,必须在有矛盾的几个因数中有所取舍
///////////////////////////////////////////
这是句放置四海而皆准的话,如果加上ms不愿意因为Xcode的改革导致很多以前代码无法编译丢失客户,这个理由似乎更充分些。毕竟unicode产生了,它确实有存在的道理。
可是谁又知道ms在做出这个选择的时候考虑了多少复杂的因素呢?我想这个答案在csdn找是pipe dream了。
理非辩不能明!如果失败是真理的妈妈,那么抬杠就是真理的爸爸。当爹还能挣分,稳赚不陪的买卖!
别着急,得让我问个明白,不够分可以加!我之所以有今天的问题是因为这另外100分!http://expert.csdn.net/Expert/topic/2844/2844394.xml?temp=.1995508
http://expert.csdn.net/Expert/topic/2844/2844394.xml?temp=.1995508up者有分!!