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. weblogic12.1.3安装

    weblogic weblogic12.1.3安装 环境: centos7.5 ip: 192.168.0.94 1.安装jdk 2.安装 weblogic 下载.解压安装包 wls1213_dev. ...

  2. otepad++ 配置 支持jquery、html、css、javascript、php代码提示

    官网下载:http://notepad-plus-plus.org/ 获取插件的方法:打开软件,窗口工具栏有有一个问号,点获取插件. 我使用的插件(安装方法都是官方的方法): QuickText.v0 ...

  3. 绕过CDN测试出真实IP

    前言 CDN的全称是Content Delivery Network,即内容分发网络.CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调度等功能模块 ...

  4. 简单的api实现以及动态函数调用

    实现一个简单的api功能,环境python2.7 请求方法:curl http://ip:8000/?name={api中的方法名}|python -m json.tool 只需编写api的方法即可 ...

  5. 使用AndEngine重制《是男人就上一百层》

    1.为什么还要做<是男人就上一百层> 一是在用Android原生API开发完<是男人就上一百层>以后,一直想体验一下用引擎开发游戏是个什么感觉,顺便也让游戏听上去高大上一些(使 ...

  6. [转帖]阿里云VS腾讯云 谁才是中国未来的云计算之王?

    阿里云VS腾讯云 谁才是中国未来的云计算之王? https://www.qianzhan.com/analyst/detail/220/191008-f05009f6.html 吴小燕• 2019-1 ...

  7. Navicat 导入,导出数据 etc

    Navicat 不仅做了分页查询, 显示 `SELECT *,rowid "NAVICAT_ROWID" FROM "main"."Table_100 ...

  8. [数据结构] - ArrayList探究

    一 概述 ArrayList可以理解为动态数组,与java的数组相比,它的容量能动态曾长,ArrayList是List接口的可变数组的实现,允许包括null值在内的所有元素.除了实现List接口外,此 ...

  9. 纯java代码搭建ssm

    参考: https://blog.csdn.net/Smile__1/article/details/103394460

  10. TypeScript 类型推导及类型兼容性

    类型推导就是在没有明确指出类型的地方,TypeScript编译器会自己去推测出当前变量的类型. 例如下面的例子: let a = 1; 我们并没有明确指明a的类型,所以编译器通过结果反向推断变量a的类 ...