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;
}
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;
}
至于setlocale是因为printf这个函数需要。
也就2万多吧,汉字才两万多个?有没有介绍unicode和字符编码的一般性的介绍文章给推荐一下?
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"。