UNICODE字符集有多个编码方式,分别是UTF-8,UTF-16和UTF-32。
UTF-8:采用变长字节 (1 ASCII, 2 希腊字母, 3 汉字, 4 平面符号) 表示,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10 开头。UTF-8最多可用到6个字节。
UTF-16:采用2字节,Unicode中不同部分的字符都同样基于现有的标准。
UTF-32:采用4字节。
使用UTF-8编码时ASCII字符只占1个字节,存储效率比较高,适用于拉丁字符较多的场合以节省空间。对于大多数非拉丁字符(如中文和日文)来说,UTF-16所需存储空间最小,每个字符只占2个字节。采用UTF-16和UTF-32会有Big Endian和Little Endian之分,而UTF-8则没有字节顺序问题,所以UTF-8适合传输和通信。
编辑文本,保存为utf-8:
FILE *myfile;
wchar_t *name=L"aaa.txt";
myfile=_wfopen(name,L"rb");
fseek(myfile,3,0);
char buff[100];
//取得所有UTF-8字节
fgets(buff,100,myfile);
printf("字节数=%d\n",strlen(buff));
printf("16进制值=");
for(int i=0;i<strlen(buff);i++)
printf("%hhx\t",buff[i]);
int num=MultiByteToWideChar(CP_UTF8,NULL,buff,-1,NULL,NULL);
wchar_t *buffw2=new wchar_t[num];
MultiByteToWideChar(CP_UTF8,NULL,buff,-1,buffw2,num);
int len = WideCharToMultiByte( CP_ACP, 0, buffw2, num, NULL, NULL, NULL, NULL );
LPSTR lpsz = new CHAR[len+1];
WideCharToMultiByte( CP_ACP, 0, buffw2, num, lpsz, len, NULL, NULL );
lpsz[len]='\0';
printf("\n字符串输出=");
printf("%s\n",lpsz);
system("pause");
编辑文本,保存为 UNICODE Little Endian
FILE *myfile;
wchar_t *name=L"ccc.txt";
myfile=_wfopen(name,L"rb"); //按照二进制方式读
fseek(myfile,0,0);
wchar_t buffw[100];
fgetws(buffw,100,myfile);
printf("字节数=%d\n",wcslen(buffw));
printf("16进制值=");
for(int i=0;i<wcslen(buffw);i++)
printf("%hhx\t",buffw[i]);
//设置本地化信息,.936是简体中文的Code Page。wcout需要依靠它决定将宽字符按什么编码显示
setlocale(LC_ALL, ".936");
printf("\n字符串输出=");
wcout<<buffw + 1<<endl;
文件编码为UNICODE Big Endian由于字节序的问题,需要转换成Little Endian 才能正确显示,因为x86系列用的是Little Endian。