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编程的时候,对着些数据类型真的是丈二和尚,摸不着头脑,长时间不用就 ...
随机推荐
- Python 练习题总结(待续)
1.编写一个函数,接受一个参数n,n为正整数,左右两种打印方 式.要求数字必须对齐 正三角 倒三角 实现思路: 思路1.一行一行打印,前面追加空格,每一个空格的宽度等于数字字符串的宽度 #正三角打印d ...
- 【Leetcode_easy】819. Most Common Word
problem 819. Most Common Word solution: class Solution { public: string mostCommonWord(string paragr ...
- 【搬运】Visual Studio vs2017 vs2019 中文离线安装包下载,替代ISO镜像
原文地址[侵删]:https://blog.csdn.net/fromfire2/article/details/81104648 以下为搬运内容: 官档地址 https://docs.microso ...
- matlab截取图像
声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 对于Matlab的使用情况常常是这样子的,很多零碎的函数名字很难记忆,经常用过后过一段时间就又忘记了,又得去网 ...
- php 常用正则表达 邮箱 手机号啥的
class RegexConst { const REGEX_MOBLIE_86 = '/^1(3|4|5|7|8)\d{9}$/';//中国手机号 const REGEX_MOBLIE_852 = ...
- 如何找到linux centos7 中 redis.conf
我们假设redis正在运行,但是我们找不带redis的配置文件redis.conf. 正确的示范: (1)systemctl status redis ● redis.service - LSB: s ...
- 洛谷 题解 UVA10048 【噪音恐惧症 Audiophobia】
[题意] 输入一个\(C\)个点\(S\)条边 \((C<=100)\) \((S<=1000)\)的无向带权图,边权表示该路径上的噪声值.当噪声太大时,耳膜可能会收到损伤,所以当你从某点 ...
- 【leetcode算法-简单】35. 搜索插入位置
[题目描述] 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5, ...
- 了解 DML、DDL、DCL
一.DML DML(Data Manipulation Language)数据操纵语言: 最经常用到的 SELECT.UPDATE.INSERT.DELETE. 主要用来对数据库的数据进行一些操作 S ...
- 整合thymeleaf
1.导入thymeleaf依赖 2.controller类 (1)模板 导入命名空间,xmlns:th="http://www.thymeleaf.org" (2)ModelAnd ...