当前位置: 首页 > 文档资料 > C 语言程序设计 >

宽窄字符

优质
小牛编辑
149浏览
2023-12-01

宽字符

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

//01.宽窄字符的使用特点:
//  1.宽窄字符变量的使用特点:
//      (1).只是存储数据的格子大小不一样,窄字符小,宽字符大
//      (2).如果存储相同的数据,只要不发生数据越界,或者存储的数据即使越界
//          但是打印的时候成中文字符字符存储单元进行打印,打印效果一致,否则乱码
//  2.宽窄字符所占用的内存字节数计算方式:
//      窄字符:
//          英文字符占用一个字节,中文字符占用两个字节
//      宽字符:
//          所有字符(无论是宽字符还是窄字符)统一占用两个字节
//  3.关于宽窄字符的乱码解决方案:
//      MessageBox();
//          (1).跟项目设置有关
//          (2).字符集设置结果:
//              默认,使用Unicode字符集,要求中文字符必须使用宽字符
//              设置,使用多字节字符集,要求中文不必要使用宽字符,窄字符就行了
//      MessageBox();+TEXT():有参宏
//          (1).跟项目编译器设置毫无关系
//          (2).使用中文的时候,需要用有参宏TEXT();进行处理
//              其实TEXT():有参宏就是在处理宽窄字符问题
//              中文自适应的进行改变(宽窄字符自动选择)
//              先判断项目编译器设置,再改变中文的形式特点(宽窄字符)
//      MessageBoxA();
//          (1).强制使用多字节字符集
//          (2).也就是中文必须使用窄字符
//      MessageBoxW();
//          (1).强制使用Unicode字符集
//          (2).也就是中文必须使用宽字符


int main01(void)
{
    char ch = 'A';//表示范围小,节约内存
    wchar_t ch1 = L'0';//宽字符占用两个字节,表示范围大,耗费内存
    printf("%d, %d \n", sizeof(char), sizeof(wchar_t));
    printf("%d, %d \n", sizeof(ch), sizeof(ch1));
    printf("%d \n",sizeof("1我"));//4byte   三个字符
    printf("%d \n",sizeof(L"1我"));//6byte "1"字符,"我"字符,"\0"字符-->3个字符

    //MessageBox(0, L"你好天朝!", L"你好世界!", 0);
    //设置Unicode,需要使用宽字符MessageBox(0, L"你好天朝!", L"你好世界!", 0);
    //设置多字节字符,需要使用在字符MessageBox(0, "你好天朝!", "你好世界!", 0);
    //中文字符串具体使用宽字符还是窄字符和项目设置有关:
    //  默认Unicode,需要对中文使用宽字符
    //  设置多字节字符集,不需要使用宽字符

    //A代表调用多字节字符集,需要使用窄字符来操作中文
    MessageBoxA(0, "你好天朝!", "你好世界!", 0);
    //W代表调用默认调用Unicode,需要使用宽字符来操作中文
    MessageBoxW(0, L"你好中文!", L"你好世界!", 0);
    //TEXT可以进行兼容自动调整,也就是忽略宽窄字符,自适应显示
    MessageBox(0, TEXT("你好天朝!"), TEXT("你好世界!"), 0);

    system("pause");
    return 1;
}

宽字符处理

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>//包含本地化设置函数的头文件

//01.宽窄字符特点:
//  1.无论是宽字符还是窄字符,赋予同一个数据,那么映射的实体都一样,只是存储盒子不一样
//  2.既然数据实体一致,那么解析的时候就看解析方式的特点了
//      %s:表示按照字符串的方式进行解析,知道解析到字符串标识符
//      %c%c:表示按照两个字节对应于两个字符进行解析,解析结果如同字符串
int main01(void)
{
    char str[10] = "我";//无论是宽窄字符所映射的数据实体都一致
    printf("%s \n", str);//按照字符串进行解析
    printf("%c%c \n", str[0], str[1]);//窄字符显示汉字(多个字符组合进行解析)

    system("pause");
    return 1;
}

//02.宽字符的使用特点:
//  1.需要设置国际化当中的本地化:
//      引入头文件:#include <locale.h>
//      设置本地化:setlocale(LC_ALL, "zh-CN");
//  2.宽字符函数处理宽字符的时候,所以宽字符
//      都给必须添加L标识
//  3.宽字符对应的格式控制符:
//      L"%ls"
int main02(void)
{
    setlocale(LC_ALL, "zh-CN");//全局使用中文环境(国际化设置)
    //wchar_t wstr[10] = L"1234";
    wchar_t wstr[10] = L"1234我是色狼!";//宽字符用wprintf,显示英文
    wprintf(L"%ls \n", wstr);//L,l宽字符处理

    system("pause");
    return 1;
}

//03.宽窄字符常量都必须采用单引号('')引上
int main(void)
{
    setlocale(LC_ALL, "zh-CN");
    wchar_t ch = L'我';
    putwchar(ch);                                                                             

    system("pause");
    return 1;
}

int main04(void)
{
    char ch = 'A';
    wchar_t wch = L'A';

    printf("%d \n", wch);

    system("pause");
    return 1;
}

int main05(void)
{
    setlocale(LC_ALL, "zh-CN");
    //printf("%s", L"我打算的");//宽字符不能使用窄字符的打印方式
    wprintf(L"%ls", L"我是");

    system("pause");
    return 1;
}