What is Unicode?
Unicode provides a unique number for every character,
no matter what the platform,
no matter what the program,
no matter what the language.以上是unicode在www.unicode.org上的 定义。1:windows 2000及其以后的操作系统既然已经使用了unicode,那为什么还会有区域的概念,为什么还会有代码页的设定。2:汉字总数要非常大,肯定超过unicode的表示范围,为什么会说unicode能保证所有的书写语言的需要。3:既然C支持unicode,那为什么还要设置正确的代码页才能显示正确的结果。#define _UNICODE
#include <stdio.h>
#include<TChar.h>
#include <locale.h>int main(int argc, char *argv[])
{

TCHAR *s = _TEXT("你好!");
setlocale( LC_ALL, "CHS");  //注释掉这一行以后,程序无法正确显示
printf("%S",s);
return 0;
}

解决方案 »

  1.   

    UINCODE的表示范围是0x0000-0xFFFF,而汉字是0x4E00-0x9FA5。所以说UNICODE的表示范围足够大,而且还有剩余。
    至于setlocale是因为printf这个函数需要。
      

  2.   

    谢谢楼上的,你说汉字是0x4E00-0x9FA5----------------------
    也就2万多吧,汉字才两万多个?有没有介绍unicode和字符编码的一般性的介绍文章给推荐一下?
      

  3.   

    1。ASCIIC unicode GBK GB2312 GB18030 BIG5 等都是一种的语言符号的编码,或者说是一个字库。把一个字或一个字母或一个标点与一个二进制数对应起来。就如同用一个身份证id和一个人对应起来。2。unicode是对全球的所有的文字符号编码,用两字节或四字节存储编码,分别称之为UCS-2和UCS-4。3。unicode向下对ASCIIC兼容,所有的ASCIIC,对与UCS-2则在前面插一个0x0,对于UCS-4则在前面插三个0x0,来完成新的编码。这样就出现很多特殊意义字符,如‘\0’等,不利于cpu运算和网络传输,于是产生了UTF-7,UTF-8,UTF-16等应用。4。UTF-7,UTF-8,UTF-16完成对unicode码的编码和正常传输,以保证不会出现错误理解的而到的特殊字符。UTF-8编码方式如下:
    UCS-4             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 说明:
    (1).UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容). 这意    味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的. 
    (2).所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集. 因此, ASCII     字节 (0x00-0x7F) 不可能作为任何其他字符的一部分. 
    (3).表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个    字符包含多少个字节. 多字节串的其余字节都在 0x80 到 0xBF 范围里. 这使得重新同步非常    容易, 并使编码无国界, 且很少受丢失字节的影响. 
    (4).可以编入所有可能的 2^31个 UCS 代码 
    (5).UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节    长. 
    (6).Bigendian UCS-4 字节串的排列顺序是预定的. 
    (7).字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到.所以Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节,分别是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。5。UTF的字节序和BOM
    UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。
      

  4.   

    1.GB2312编码大约包含6000多汉字(不包括特殊字符),编码范围为第一位b0-f7,第二位编码范围为a1-fe(第一位为cf时,第二位为a1-d3),计算一下汉字个数为6762个汉字。当然还有其他的字符。包括控制键和其他字符大约7573个字符编码2.gbk编码是对G B2312编码的扩充,容纳的汉字更多,但仅仅是扩充,没有质的变化。保留了所有G B2312编码,在此基础上进行编码范围的扩充.容纳(包含特殊字符)共22014个字符编码.3.gb18030编码是在gbk编码基础上的扩充,因为汉字更多,仅仅使用两位编码已经不能容纳要求的汉字,所以采用了2\4位混和的办法,可以支持更多的汉字编码。并且保留了原有的gbk 2字节编码兼容G B2312和gbk编码的文件。大概容纳55657个编码(包含特殊字符)4.unicode编码(也就是UTF编码):俗称万国码,致力于使用统一的编码准则表达各国的文字。为表达更多的文字,utf-8采用2/3混编的方式。目前容纳的汉字范围小于gbk编码。并且以3字节的方式处理中文,带来了兼容性的问题,原有的gbk,G B2312,gb18030编码文件都不能正常的处理,还有很长的路要走。
      

  5.   

    utf-8编码表示的汉字比GBK还少
      

  6.   

    我用C#写了一个显示所有UNICODE编码的程序,哪位感兴趣留下Email。
      

  7.   

    谢谢楼上的各位,我已经把这几点疑问解决了,其实我只是一时兴趣,楼上几位能提供这么详细的说明,实在难得。我把总结的内容放到我的blog上了,大家有兴趣可以来看看:http://blog.csdn.net/hailongchang