字符串编码

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 双字节转单字节字符串

猜你喜欢

转载自blog.csdn.net/qq_37124717/article/details/81592134