据说 unicode 可以容纳世界上的绝大部分的字符,不知道是不是真的,因为我听说汉字就可能有两三万个字符,再加上拉丁文,法文,德文,韩文等,两个字节65535的容量怎么放得下呢?还有就是既然软件中使用的字符串,在设置的时候都指定了字符集,为什么还和操纵系统的字符集有关系。

解决方案 »

  1.   

    我们面临的基本问题是世界上的书写语言不能简单地用256个8位元代码表示。以前的解决方案包括内码表和DBCS已被证明是不能满足需要的,而且也是笨拙的。那什么才是真正的解决方案呢?身为程式写作者,我们经历过这类问题。如果事情太多,用8位元数值已经不能表示,那么我们就试更宽的值,例如16位元值。而且这很有趣的,正是Unicode被制定的原因。与混乱的256个字元代码映射,以及含有一些1位元组代码和一些2位元组代码的双位元组字元集不同,Unicode是统一的16位元系统,这样就允许表示65,536个字元。这对表示所有字元及世界上使用象形文字的语言,包括一系列的数学、符号和货币单位符号的集合来说是充裕的。明白Unicode和DBCS之间的区别很重要。Unicode使用(特别在C程式设计语言环境里)「宽字元集」。「Unicode中的每个字元都是16位元宽而不是8位元宽。」在Unicode中,没有单单使用8位元数值的意义存在。相比之下,在双位元组字元集中我们仍然处理8位元数值。有些位元组自身定义字元,而某些位元组则显示需要和另一个位元组共同定义一个字元。处理DBCS字串非常杂乱,但是处理Unicode文字则像处理有秩序的文字。您也许会高兴地知道前128个Unicode字元(16位元代码从0x0000到0x007F)就是ASCII字元,而接下来的128个Unicode字元(代码从0x0080到0x00FF)是ISO 8859-1对ASCII的扩展。Unicode中不同部分的字元都同样基於现有的标准。这是为了便於转换。希腊字母表使用从0x0370到0x03FF的代码,斯拉夫语使用从0x0400到0x04FF的代码,美国使用从0x0530到0x058F的代码,希伯来语使用从0x0590到0x05FF的代码。中国、日本和韩国的象形文字(总称为CJK)占用了从0x3000到0x9FFF的代码。Unicode的最大好处是这里只有一个字元集,没有一点含糊。Unicode实际上是个人电脑行业中几乎每个重要公司共同合作的结果,并且它与ISO 10646-1标准中的代码是一一对应的。Unicode的重要参考文献是《The Unicode Standard,Version 2.0》(Addison-Wesley出版社,1996年)。这是一本特别的书,它以其他文件少有的方式显示了世界上书写语言的丰富性和多样性。此外,该书还提供了开发Unicode的基本原理和细节。Unicode有缺点吗?当然有。Unicode字串占用的记忆体是ASCII字串的两倍。(然而压缩档案有助於极大地减少档案所占的磁碟空间。)但也许最糟的缺点是:人们相对来说还不习惯使用Unicode。身为程式写作者,这就是我们的工作。
    摘自<<windows程序设计>>
      

  2.   

    我也想从《windows程序设计》摘出上面的话来,可惜完了!
    再摘点给你:
    字元集简史
     虽然不能确定人类开始讲话的时间,但书写已有大约6000年的历史了。实际上,早期书写的内容是象形文字。每个字元都对应於发声的字母表则出现於大约3000年前。虽然人们过去使用的多种书写语言都用得好好的,但19世纪的几个发明者还是看到了更多的需求。Samuel F. B. Morse在1838年到1854年间发明了电报,当时他还发明了一种电报上使用的代码。字母表中的每个字元对应於一系列短的和长的脉冲(点和破折号)。虽然其中大小写字母之间没有区别,但数字和标点符号都有了自己的代码。Morse代码并不是以其他图画的或印刷的象形文字来代表书写语言的第一个例子。1821年到1824年之间,年轻的Louis Braille受到在夜间读写资讯的军用系统的启发,发明了一种代码,它用纸上突起的点作为代码来帮助盲人阅读。Braille代码实际上是一种6位元代码,它把字元、常用字母组合、常用单字和标点进行编码。一个特殊的escape代码表示後续的字元代码应解释为大写。一个特殊的shift代码允许後续代码被解释为数字。Telex代码,包括Baudot (以一个法国工程师命名,该工程师死于1903年)以及一种被称为CCITT #2的代码(1931年被标准化),都是包括字元和数字的5位元代码。美国标准
     早期电脑的字元码是从Hollerith卡片(号称不能被折叠、卷曲或毁伤)发展而来的,该卡片由Herman Hollerith发明并首次在1890年的美国人口普查中使用。6位元字元码系统BCDIC(Binary-Coded Decimal Interchange Code:二进位编码十进位交换编码)源自Hollerith代码,在60年代逐步扩展为8位元EBCDIC,并一直是IBM大型主机的标准,但没使用在其他地方。美国资讯交换标准码(ASCII:American Standard Code for Information Interchange)起始於50年代後期,最後完成於1967年。开发ASCII的过程中,在字元长度是6位元、7位元还是8位元的问题上产生了很大的争议。从可靠性的观点来看不应使用替换字元,因此ASCII不能是6位元编码,但由於费用的原因也排除了8位元版本的方案(当时每位元的储存空间成本仍很昂贵)。这样,最终的字元码就有26个小写字母、26个大写字母、10个数字、32个符号、33个代号和一个空格,总共128个字元码。ASCII现在记录在ANSI X3.4-1986字元集-用於资讯交换的7位元美国国家标准码(7-Bit ASCII:7-Bit American National Standard Code for Information Interchange),由美国国家标准协会(American National Standards Institute)发布。图2-1中所示的ASCII字元码与ANSI文件中的格式相似。ASCII有许多优点。例如,26个字母代码是连续的(在EBCDIC代码中就不是这样的);大写字母和小写字母可通过改变一位元资料而相互转化;10个数位的代码可从数值本身方便地得到(在BCDIC代码中,字元「0」的编码在字元「9」的後面!)最棒的是,ASCII是一个非常可靠的标准。在键盘、视讯显示卡、系统硬体、印表机、字体档案、作业系统和Internet上,其他标准都不如ASCII码流行而且根深蒂固
      

  3.   

    看看Charles Petzold的大作吧!Programming Windows程式开发设计指南
    肯定让你茅塞顿开!
      

  4.   

    顺便问一句。新建一个对话框工程,在stdafx.h的开始加上两行
    #define UNICODE
    #define _UNICODE
    但在编译的时候说:
    --------------------Configuration: tu - Win32 Debug--------------------
    Linking...
    msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
    Debug/tu.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.tu.exe - 2 error(s), 0 warning(s)为什么?????????????????、、、注:stdafx.h
    // stdafx.h : include file for standard system include files,
    //  or project specific include files that are used frequently, but
    //      are changed infrequently
    //#if !defined(AFX_STDAFX_H__F77C76E4_840A_4643_8C0D_A3BCAA090BA2__INCLUDED_)
    #define AFX_STDAFX_H__F77C76E4_840A_4643_8C0D_A3BCAA090BA2__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000#define _UNICODE
    #define UNICODE#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers#include <afxwin.h>         // MFC core and standard components
    #include <afxext.h>         // MFC extensions
    #include <afxdisp.h>        // MFC Automation classes
    #include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
    #ifndef _AFX_NO_AFXCMN_SUPPORT
    #include <afxcmn.h> // MFC support for Windows Common Controls
    #endif // _AFX_NO_AFXCMN_SUPPORT
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_STDAFX_H__F77C76E4_840A_4643_8C0D_A3BCAA090BA2__INCLUDED_)
      

  5.   

    你写的是WIN32程序,需要WinMain函数入口,如果你写的是Console程序的话,
    ALT+F7,选中Link,把/system:windows
    改成/system:console
      

  6.   

    最后问一句,是不是只要使用了unicode的编码的字符串就不会出现乱码?