【Win32准备】API,Win32入口程序,宽字符(上)

简介: 【Win32准备】API,Win32入口程序,宽字符

一.多字节字符与宽字节字符

在介绍多字符之前,向大家介绍ASCII编码,这里给出ASCII编码对照表(完整版)。ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。其中最后一位用于奇偶校验

ASCII码存在的问题: 我们在使用ASCII表的时候,通常会出现乱码的问题,因为ASCII码只有256个字符,我们在使用ASCII码判断内容的时候,通常会出现误差。

类似于ASCII码的一张全是中文汉字的表: GB2312-80码。

UNICODE编码:

在前面我们提到了,在使用ASCII码的时候通常会出现各种各样的问题,那么有没有什么解决方法呢?这里就要给出我们的UNICODE表,Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

多字节字符:在C语言和C++语言中,char表示多字节字符,我们知道char在内存中占据一个字节,那为什么叫做多字节字符呢?这是因为当要表示一个字时,他可能占用一个字节,也有可能占据好几个字节,比如说当表示中文的时候

其实当使用多字节的时候,编译器对应的是ASCII码表,在ASCII表中查找对应的字符。

宽字节字符:在C++中,wchar_t表示宽字节字符,当他表示一个字的时候,只能是两个字节

当使用宽字节的时候,编译器查找的是UNICODE表,我们前面介绍了,UNICODE表中每个字符都是两个字节(除了特殊情况)。

1.宽字符的使用示例

接下来我们通过示例来看看多字节和宽字节:

#include <stdio.h>
int main()
{
    char x = '中';
    wchar_t x1 = L'中';
    printf("%s\n", &x);
    wprintf(L"%s\n", &x1);
}

我们来到内存窗口查看:

我们可以到ASCII编码表和Unicode表中查看,字符“中”在ASCII表中对应的十六进制编号为0xD0D6,在Unicode编码表中对应的十六进制编号为0x4E2D,而在我们的内存窗口中我们可以看到,以ASCII码的形式存储到内存的时候,只存储了低位一字节,而以Unicode码存储的时候,两个字节完整地存储到了内存中。

2.如何使用宽字符和多字节

我们上文已经介绍过,char类型为多字节,wchar_t类型为宽字符类型,我们来通过示例看看:

#include <stdio.h>
int main()
{
    char x[] = "中国";
    wchar_t x1[] = L"中国";
    printf("%s\n", &x);
    wprintf(L"%s\n", &x1);
}

我们来到局部变量窗口看看:

我们可以看到,多字节是以00 结尾,而宽字符是以00 00 结尾的。

3.控制台打印

那么宽字节和多字符在控制台如何打印呢?

多字节使用printf("%s\n",x); ,宽字符使用wprintf(L"%s\n",x1); 那么在上文中我们多次使用大写的” L “,那么它代表什么意思呢?这里编译器默认的是使用ASCII表来查找字符,我们使用” L “就是告诉编译器,使用Unicode码,这时候编译器就会使用Unicode表来替我们查找字符了。

二.如何告诉编译器在控制台打印简体中文

我们知道,Unicode表中记录了很多国家的文字,那么我们如何告诉编译器,在控制台打印的时候打印简体中文呢?

我们需要加入预编译:#include <locale.h> 在程序中加入:setlocale(LC_ALL,""); 这个函数,这个函数就是告诉控制台:使用控制台默认的编码,我们在该函数第二个参数中为传入值,这时候就会使用操作系统中的地域,比如你的操作系统为中国,那么它就会设置为简体中文。

#include <stdio.h>
#include <locale.h>
int main()
{
    setlocale(LC_ALL, "");
    char x[] = "中国";
    wchar_t x1[] = L"中国";
    printf("%s\n", &x);
    wprintf(L"%s\n", &x1);
}

这样一番操作下来之后,我们在控制台就可以正确地打印了:


相关文章
|
网络协议 API 数据处理
【网络编程】第2章(2) 应用程序接口(API)
【网络编程】第2章(2) 应用程序接口(API)
|
6月前
|
程序员 API C语言
Win32 API介绍​(COORD、GetStdHandle、GetConsoleCursorInfo 、SetConsoleCursorInfo)、<locale.h>本地化、类项
Win32 API介绍​(COORD、GetStdHandle、GetConsoleCursorInfo 、SetConsoleCursorInfo)、<locale.h>本地化、类项
|
3月前
|
移动开发 开发框架 小程序
开发H5程序或者小程序的时候,后端Web API项目在IISExpress调试中使用IP地址,便于开发调试
开发H5程序或者小程序的时候,后端Web API项目在IISExpress调试中使用IP地址,便于开发调试
|
6月前
|
API Python Windows
python3应用windows api对后台程序窗口及桌面截图并保存的方法
python3应用windows api对后台程序窗口及桌面截图并保存的方法
513 1
|
5月前
|
XML JSON API
RESTful API关键部分组成和构建web应用程序步骤
RESTful API关键部分组成和构建web应用程序步骤
35 0
api一键自动合约跟单模式 | 程序化交易系统开发讲解【附样板源码实例分析】
“量化交易”有着两层含义:一是从狭义上来讲,是指量化交易的内容,将交易条件转变成为程序,自动下单;二是从广义上来讲,是指系统交易方法,就是一个整合的交易系统。
|
6月前
|
API 网络架构
解释 RESTful API,以及如何使用它构建 web 应用程序。
解释 RESTful API,以及如何使用它构建 web 应用程序。
118 0
|
6月前
|
JSON API 数据格式
RESTful API,以及如何使用它构建 web 应用程序。
RESTful API,以及如何使用它构建 web 应用程序。
95 0
|
6月前
|
监控 编译器 API
常用Win32 API的简单介绍
常用Win32 API的简单介绍
|
11月前
|
存储 JavaScript 前端开发
使用 HTML、CSS、JS 和 API 制作一个很棒的天气 Web 应用程序
使用 HTML、CSS、JS 和 API 制作一个很棒的天气 Web 应用程序
137 0