字符串打印

来源:9-10 宽字符串与窄字符串的转换

wxz123

2021-01-30

wchar_t *z=L"您好";
wprintf(L"%s\n",z);

老师,上面的代码我用MSVC,文件使用gbk编码,为啥打印的结果不是 您好 呢?
下面的代码,我用MSVC,文件使用gbk编码,可以打印出您好,用mingw,文件使用utf8编码,打印就是错的了

char z[]="您好";
printf("%s\n",z);
puts(z);

感觉这一块好乱呐

写回答

1回答

bennyhuo

2021-01-31

先看第一个哈:

wprintf 会把参数宽字符串转成窄字符,然后打印到控制台。这个转换的过程需要知道目标窄字符的编码(宽字符的编码时确定的,一般就是 UTF-16),这个编码取决于 locale。msvc 默认的 locale 是 C,因此打印时转换的结果并不会是 gbk 编码。如果你在 msvc 上打印之前调用 setlocal(LC_ALL, "chs"),结果就可以正确输出了。视频里面有讲,仔细回顾一下哈。


下面的是窄字符,MSVC 使用 gbk 编码,是因为 windows 默认的中文编码使用的是 gbk,要确保编译器能以 gbk 的形式将 您好 二字读到内存里面,所以文件使用 gbk 编码。视频里面我们也有讲你想要给 msvc 用 utf-8 编码要怎么配置。mingw 默认则使用 utf-8 编码,逻辑类似。mingw 打印出来的是乱码,主要是因为控制台的编码时 gbk。切换一下控制台的编码就行了。


0
0

C语言系统化精讲 重塑编程思想 打造坚实的开发基础

如果通向大牛的道路有捷径,那就是先学好C语言

2208 学习 · 853 问题

查看课程