VS 2017下源码

 #include<stdio.h>

 int main()
{
char ASC_a = 'a';
char *ASC_str = "hello";
wchar_t W_a = 'a';
wchar_t *W_str = "hello";
printf("ASC_a = %c\n", ASC_a);
printf("sizeof(ASC_a) = %d\n", sizeof(ASC_a));
printf("ASC_str = %s\n", ASC_str);
/* 打印ASC_a的内存 */
printf("ASC_a = 0x%x\n", &ASC_a); printf("W_a = %c\n", W_a);
printf("sizeof(W_a) = %d\n", sizeof(W_a));
printf("W_str = %s\n", W_str);
/* 打印W_a的内存 */
printf("W_a = 0x%x,0x%x\n", *((char*)&W_a), *(((char*)&W_a)+)); getchar();
return ;
}

运行结果

wchar_t *W_str = "hello";

对于宽字符串,如果使用printf("W_str = %s\n", W_str);可能不会打印出完整的字符串,而只显示第一个字符。

其原因是因为:宽字符占用2Byte,第二个字节就是\0。printf以为自己到头了,所以只打印一个字节。对printf使用%S参数,或者使用wprintf来避免这一问题。我手上的是VS 2017,使用printf("W_str = %s\n", W_str);居然也可以正常打印,其他版本的VS估计不行。

如果是其他版本的VS,可能需要在宽字符前面加L,打印宽字符串需要使用%S。这时候源码如下

 #include<stdio.h>

 int main()
{
char ASC_a = 'a';
char *ASC_str = "hello";
wchar_t W_a = L'a';
wchar_t *W_str = L"hello";
printf("ASC_a = %c\n", ASC_a);
printf("sizeof(ASC_a) = %d\n", sizeof(ASC_a));
printf("ASC_str = %s\n", ASC_str);
/* 打印ASC_a的内存 */
printf("ASC_a = 0x%x\n", &ASC_a); printf("W_a = %c\n", W_a);
printf("sizeof(W_a) = %d\n", sizeof(W_a));
printf("W_str = %S\n", W_str);
/* 打印W_a的内存 */
printf("W_a = 0x%x,0x%x\n", *((char*)&W_a), *(((char*)&W_a)+)); getchar();
return ;
}

还可以使用TCHAR无脑处理Unicode ASCII。如果定义了_UNICODE,那么TCHAR = wchar_t,否则位char。如果定义了_UNICODE,那么_TEXT=L,否则_TEXT=空

 #include<tchar.h>

 int main()
{
TCHAR ASC_a = 'a';
TCHAR *ASC_str = "hello";
TCHAR W_a = L'a';
TCHAR *W_str = L"hello";
_tprintf(_TEXT("ASC_a = %c\n"), ASC_a);
_tprintf(_TEXT("sizeof(ASC_a) = %d\n"), sizeof(ASC_a));
_tprintf(_TEXT("ASC_str = %s\n"), ASC_str);
/* 打印ASC_a的内存 */
_tprintf(_TEXT("ASC_a = 0x%x\n"), &ASC_a); _tprintf(_TEXT("W_a = %c\n"), W_a);
_tprintf(_TEXT("sizeof(W_a) = %d\n"), sizeof(W_a));
_tprintf(_TEXT("W_str = %s\n"), W_str);
/* 打印W_a的内存 */
_tprintf(_TEXT("W_a = 0x%x,0x%x\n"), *((char*)&W_a), *(((char*)&W_a)+)); _gettchar();
return ;
}

如果包含了Windows.h,就不用写_TEXT了,使用TEXT

04 Windows编程——Unicode的更多相关文章

  1. 【Windows编程】系列第四篇:使用Unicode编程

    上一篇我们学习了Windows编程的文本及字体输出,在以上几篇的实例中也出现了一些带有“TEXT”的Windows宏定义,有朋友留言想了解一些ANSI和Unicode编程方面的内容,本章就来了解和学习 ...

  2. Windows编程中UNICODE和_UNICODE定义问题

    Windows编程中UNICODE和_UNICODE定义问题 先转一篇文章: 初学Windows SDK编程时碰到过这个问题,相信很多初学Windows编程的人也都碰到过,后来慢慢搞明白些了,但有时别 ...

  3. windows 编程—— 宽字符集 与 Unicode

    目录: 从ASCII码 到 Unicode Windows 编程中的 "字符” 定义 (如何在windows下进行通用编码) 常用的通用函数,定义 (本文为学习<Programming ...

  4. 【Windows编程】系列第六篇:创建Toolbar与Statusbar

    上一篇我们学习了解了如何使用Windows GDI画图,该应用程序都是光光的静态窗口,我们使用Windows应用程序,但凡稍微复杂一点的程序都会有工具栏和状态栏,工具栏主要用于一些快捷功能按钮.比如典 ...

  5. 【Windows编程】系列第五篇:GDI图形绘制

    上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...

  6. 【Windows编程】系列第九篇:剪贴板使用

    上一篇我们学习了常见的通用对话框,本篇来了解剪贴板的使用,它常用于复制粘贴功能. 剪贴板是Windows最早就加入的功能,由于该功能非常实用,我们几乎每天都会使用到.通过剪贴板,我们就可以将数据从一个 ...

  7. windows 编程—— 学习指导

    这里有一份很好的资源,被制作成chm文件的<Windows 程序设计>,包含了中文版和英文版,还有全书源代码,虽然不知道是谁出版的,但是感觉对Windows编程新手来说还是很不错的.关键还 ...

  8. 有一定基础的 C++ 学习者该怎样学习 Windows 编程?

    人的心理有个奇异的特性:一项知识一旦学会之后,学习过程中面临的困惑和不解非常快就会忘得干干净净,似乎一切都是自然而然,本来就该这种.因此,关于「怎样入门」这类问题,找顶尖高手来回答,未必能比一个刚入门 ...

  9. Windows 编程中恼人的各种字符以及字符指针类型

    在Windows编程中,很容易见到这些数据类型:LPSTR,LPTSTR,LPCTSTR... 像很多童鞋一样,当初在学Windows编程的时候,对着些数据类型真的是丈二和尚,摸不着头脑,长时间不用就 ...

随机推荐

  1. LODOP获取打印状态码和时间列表

    之前有博文介绍获取打印状态码和打印状态码的含义,相关博文:LODOP获取打印机状态码和状态码含义测试.此外 ,也有获取状态码及其变化的方法,可以获取打印状态码的列表,列表包含每个状态和每个状态的时间. ...

  2. pip3 install pyinstaller 报错了的处理方法

    http://www.pyinstaller.org/downloads.html 下载压缩包 解压到本地后,在目录处cmd 执行命令 python setup.py install 然后执行pip ...

  3. in-place数据交换

    实现in-place的数据交换 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 经典的排序问题 问题描述 一个数组中包含两个已经排好序的子数组,设计一个in- ...

  4. spring boot 单选按钮

    jsp代码 性别: <form:radiobutton path="xb" value="男"/>男 <form:radiobutton pa ...

  5. luogu1972:HH的项链

    题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...

  6. python数据结构_递归_汉诺塔问题

    已经不是第一次写这个汉诺塔问题, 其实递归还真是不太好理解, 因为递归这种是想其实有点反人类, 为什么? 因为不太清楚, 写个循环一目了然, 用递归其实要把核心逻辑理清楚, 要不根本没法进行下去 所有 ...

  7. Chocolate Eating【二分】

    题目链接:https://ac.nowcoder.com/acm/contest/1577/K 题目大意: 给出n块巧克力,m天吃完.每块巧克力有a[i]快乐值,每天可以选择吃任意块或者不吃巧克力(按 ...

  8. MySQL(二) decimal数据默认处理

    create table decimal_test(id int auto_increment PRIMARY key,score decimal(5,2) -- 取值范围是 -999.99 到 99 ...

  9. Rabbitmq C++客户端 Rabbitmq Client

    概述 最近项目消息队列服务选用了rabbitmq,server端用的C++开发的,于是需要开发rabbitmq的c++客户端,国际惯例先百度了一圈,然后github搜了一圈,竟然发现排名靠前的需要付费 ...

  10. I2C的协议层和物理层

    I2C 协议简介 I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART.CAN 等通讯协议的 ...