04 Windows编程——Unicode
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的更多相关文章
- 【Windows编程】系列第四篇:使用Unicode编程
上一篇我们学习了Windows编程的文本及字体输出,在以上几篇的实例中也出现了一些带有“TEXT”的Windows宏定义,有朋友留言想了解一些ANSI和Unicode编程方面的内容,本章就来了解和学习 ...
- Windows编程中UNICODE和_UNICODE定义问题
Windows编程中UNICODE和_UNICODE定义问题 先转一篇文章: 初学Windows SDK编程时碰到过这个问题,相信很多初学Windows编程的人也都碰到过,后来慢慢搞明白些了,但有时别 ...
- windows 编程—— 宽字符集 与 Unicode
目录: 从ASCII码 到 Unicode Windows 编程中的 "字符” 定义 (如何在windows下进行通用编码) 常用的通用函数,定义 (本文为学习<Programming ...
- 【Windows编程】系列第六篇:创建Toolbar与Statusbar
上一篇我们学习了解了如何使用Windows GDI画图,该应用程序都是光光的静态窗口,我们使用Windows应用程序,但凡稍微复杂一点的程序都会有工具栏和状态栏,工具栏主要用于一些快捷功能按钮.比如典 ...
- 【Windows编程】系列第五篇:GDI图形绘制
上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...
- 【Windows编程】系列第九篇:剪贴板使用
上一篇我们学习了常见的通用对话框,本篇来了解剪贴板的使用,它常用于复制粘贴功能. 剪贴板是Windows最早就加入的功能,由于该功能非常实用,我们几乎每天都会使用到.通过剪贴板,我们就可以将数据从一个 ...
- windows 编程—— 学习指导
这里有一份很好的资源,被制作成chm文件的<Windows 程序设计>,包含了中文版和英文版,还有全书源代码,虽然不知道是谁出版的,但是感觉对Windows编程新手来说还是很不错的.关键还 ...
- 有一定基础的 C++ 学习者该怎样学习 Windows 编程?
人的心理有个奇异的特性:一项知识一旦学会之后,学习过程中面临的困惑和不解非常快就会忘得干干净净,似乎一切都是自然而然,本来就该这种.因此,关于「怎样入门」这类问题,找顶尖高手来回答,未必能比一个刚入门 ...
- Windows 编程中恼人的各种字符以及字符指针类型
在Windows编程中,很容易见到这些数据类型:LPSTR,LPTSTR,LPCTSTR... 像很多童鞋一样,当初在学Windows编程的时候,对着些数据类型真的是丈二和尚,摸不着头脑,长时间不用就 ...
随机推荐
- laravel原生sql
转自:https://www.cnblogs.com/zouzhe0/p/6307077.html DB::insert(, ']); $user = DB::]); //我们还 可以看到在执行查询的 ...
- 解决jdk卸载出错2502、2503
之前装的jdk1.6,后来软件要求用1.8,就卸载了1.6,卸载的时候出现了这个问题.后来又有其他软件用1.8出错,就又要装1.6,脑壳疼.网上建议先卸载1.8再装低版本,结果卸载1.8,又出现错误2 ...
- 【VS开发】fatal error C1853: "Debug\sift.pch"预编译头文件来自编译器的早期版本
fatal error C1853: "Debug\sift.pch"预编译头文件来自编译器的早期版本 <pre id="best-content-12991040 ...
- 高级UI-RecyclerView拖拽和侧滑
RecyclerView强大的地方在于高度的可定制,正式由于此优点,现在的项目大多使用RecyclerView,这里我们仿照QQ的功能,实现RecyclerView的拖拽和侧滑功能 功能说明 上下拖拽 ...
- kubespray部署k8s
0.把外网的/usr/local/bin/*拷过来覆盖 1.把部署好的集群的 calicoctl cni-plugins-linux-amd64-v0.8.1.tgz kubeadm-v1.16.3- ...
- luoguP1463:反素数ant(打表心得☆)
题目描述 对于任何正整数x,其约数的个数记作g(x).例如g()=.g()=. 如果某个正整数x满足:g(x)>g(i) <i<x,则称x为反质数.例如,整数1,,,6等都是反质数. ...
- Asp.Net Core文件上传
文件上传功能在实际开发中经常使用,在 .Net Core中,文件上传接收类型不再使用 HttpPostedFile 或 HttpFileCollection来接收,而是使用 IFormFile 或 I ...
- HttpClient的几种请求方式
public static String doPostToken(String tokenUrl,String clientId,String clientSecret,String grantTyp ...
- [转帖]如何保护你的 Python 代码 (一)—— 现有加密方案
如何保护你的 Python 代码 (一)—— 现有加密方案 Prodesire Python猫 1周前
- [转帖]从零开始入门 K8s:应用编排与管理:Job & DaemonSet
从零开始入门 K8s:应用编排与管理:Job & DaemonSet https://www.infoq.cn/article/KceOuuS7somCYbfuykRG 陈显鹭 阅读数:193 ...