1. Unicode 的编码方式
编码类似1小时和60分钟的关系,本质的时间刻度还是相同的。
Unicode 编码有 UTF-8、UTF-16 和 UTF-32 ,它们都是将数字转换到程序数据的编码方案。
UTF-8:以字节为单位。表示一个字符时,能用一个字节就不用两个或者三个字节表示。
UTF-16:以 16 位无符号整数为单位。表示一个字符时,能用两个字节就不用四个字节表示。
UTF-32:以 32 位无符号整数为单位。
2. 文件开头几个字节与文件编码的关系
字节顺序标记(BOM) | 编码格式 | 说明 |
---|---|---|
EF BB BF | UTF-8 with BOM | |
FF FE | UTF-16LE | little endian |
FE FF | UTF-16BE | big endian |
FF FE 00 00 | UTF-32LE | little endian |
00 00 FE FF | UTF-32BE | big-endian |
Linux 下新建文件编码纯英文为ASCII text,中混英为 UTF-8 Unicode text
3. Unicode 的 UTF-16 与 UTF-8
/* main.cpp Unicode encoding in Windows Vs */
#include <stdio.h>
#include <string.h>
#include <tchar.h>
int main(void)
{
printf("%d\n", sizeof("ABCD"));
printf("%d\n", sizeof(_T("ABCD"))); //双字节Unicode编码
printf("%d\n", sizeof("汉"));
printf("%d\n", sizeof(_T("汉"))); //双字节Unicode编码
printf("%d\n", strlen("ABCD"));
printf("%d\n", strlen( (const char *)(_T("ABCD")) ));
char unic_str[10];
memcpy(unic_str, (_T("ABCD")), 10);
for (int i = 0; i < 10; i++)
{
if (unic_str[i] == '\0')
{
printf("unic_str[%d]=\\0\n", i);
}
else
{
printf("unic_str[%d]=%c\n", i, unic_str[i]);
}
}
getchar();
return 0;
}
(1) VS 默认定义 UNICODE 。
(2)_T 表示 Unicode 双字节编码 。
(3)UNICODE 宏只是影响的 _T 声明的字符串,未使用 _T 声明的使用 UTF-8 编码 。
4. 简单的编码转换
/* main.cpp Unicode encoding in Windows Vs */
#include <stdio.h>
#include <atlstr.h>
int main(void)
{
CString cs_string;
char * c_string = "char[] to cstring to char[]";
USES_CONVERSION;
cs_string = A2T(c_string);
c_string = T2A(cs_string);
printf("%s\n", c_string);
getchar();
return 0;
}
(1)CString 字符数组对象, Unicode下为 UTF-16 编码。
(2)USES_CONVERSION 分配编码转换空间,在循环体内可能引发栈溢出。
(3)A2T 单字节转双字节字符串,T2A 双字节转单字节字符串