API入门系列之二 -Unicode还是ASCII

看雪学院-OllyDBG入门系列(三)笔记 原作地址:http://bbs.pediy.com/showthread.php?threadid=21330 作者:CCDebuger   看雪学院-OllyDBG入门系列(三)笔记 这样的编辑框中输注册码的程序,要设断点,首选的 API 函数就是 GetDlgItemText 及 GetWindowText。 每个函数都有两个版本,一个是 ASCII 版,在函数 阅读详情

 

原创文章,转载请注明作者及出处。

 

首发:

http://blog.youkuaiyun.com/beyondcode

http://www.cnblogs.com/beyond-code/

http://hi.baidu.com/beyondcode

今天,开始第二篇文章,这章我准备介绍一下Windows平台下编程中Unicode编码和ASCII编码的相关问题。

不知道各位新手朋友们遇到这样的问题没有呢,新建一个Windows应用程序,调用MessageBox这个函数,准备让它弹出一段提示文本,可是编译器在编译的时候却报错说,不能将 const char* 或者 const char[] 转换为 const wchar_t* 之类的提示呢,很多刚接触Windows API编程的朋友们在这里可能就卡住了,不知如何下手解决了,其实,这就是Unicode编码和ASCII编码的问题了。我下面就会一一道来

关于Unicode和ASCII具体的编码是怎么的,我这里就不详细介绍了,也介绍不了,如果需要深入了解,网上有很多这方面的专门文章,我这里就只对Unicode编码和ASCII编码在Windows平台下的编程相关的内容进行介绍。

我们都知道Unicode和ASCII最大的区别就是Unicode采用2个字节来存储一个字符,不管是英文,汉字,还是其他国家的文字,都有能用2个字节来进行编码,而ASCII采用一个字节存储一个字符,所以对于英文的编码,那是足够的了,可是对于汉字的编码,则必须采用一些特殊的方法,用2个ASCII字符来表示一个汉字。

我们在写程序的过程中,势必要和字符打交道,要输入,获取,显示字符,到底是选用Unicode字符呢还是ASCII字符呢,这都是各位自己的权利。但为了程序的通用性和符合目前操作系统的主流趋势,Unicode编码是被推荐的。由于Unicode字符要比ASCII字符占用的空间大一倍,编译出来的程序在体积上和占用的内存上必定要大一些,不过这并不是什么很大的问题。所以微软目前的SDK中保留了2套API,一套用于采用Unicode编码处理字符的程序的编写,一套用于采用ASCII编码处理字符的程序的编写。 例如,我们上面提到的MessageBox,它其实不是一个函数名,而是一个宏定义,我们先来看看它是怎么被定义的,再来讨论它。

#ifdef UNICODE

#define MessageBox  MessageBoxW

#else

#define MessageBox  MessageBoxA

#endif 

看到了吗?  很简单是不是, 如果定义了UNICODE 这个宏 那么就定义MessageBox为MessageBoxW,如果没有定义UNICODE这个宏, 那么就定义MessageBox 为MessageBoxA,MessageBox后面的W和A 就是代表宽字节(Unicode)和ASCII,这样,其实存在于SDK中的函数是MessageBoxW和MessageBoxA这两个函数.

MessageBox只是一个宏而已。所以在程序中,这3个名字你都可以使用,只不过需要注意的是,使用MessageBoxA的话,那么你要注意传给它的参数,字符都必须是单字节,也就是ASCII, 在程序中就是char,如果使用MessageBoxW的话,那么,字符都必须使用Unicode,程序中就是 wchar_t。 但是这样有个非常不方便的地方那就是,如果你使用W后缀系列的函数的话,那么你的程序使用的字符就是Unicode字符编码的,但是如果你需要用这个程序的源代码编译出字符采用ASCII编码的程序,那么需要改动的地方就太大了。凡是涉及到字符操作的地方都需要改变。那么 ,有没有比较好的办法不做更改就可以用同样的代码编译出ASCII版本的程序呢。  

当然有,就是我们在编程的时候尽量使用不带后缀的宏定义,如上例,就使用MessageBox,其中的参数也不明确使用char 还是wchar_t 而是使用微软给我们定义的TCHAR字符数据类型,它的定义和上面MessageBox函数的定义差不多,都是根据是否定义了UNICODE这个宏来判断是将TCHAR定义为char还是wchar_t,所以这样一来,这个TCHAR的数据类型就是可变的了,它根据工程的设置而定义为相应的最终字符类型,这样我们的程序就可以不做任何更改就可以轻松的编译出另外一个版本的了。是不是非常方便。

前面2篇文章纯文字的介绍比较多,因为很多是概念性的,需要理解,后面的文章我准备配合一些小示例程序,使用一些简单的API函数,遇到的相关的概念在一并介绍的方法进行。所以,前2篇文章如果各位朋友不是很能理解,不用担心,影响不是很大,经过后面的学习,你就会慢慢的理解前面所说的内容了。

By-deathcode

Unicode 和 ASCII 字符集 简单来说:​​ASCII​​ 是​​早期​​的字符编码标准,主要用于表示​​英文字符​​,每个字符固定占用​​1个字节​​。​​Unicode​​ 是一个更​​全面​​的字符集,旨在涵盖​​全球几乎所有字符​​,并为每个字符分配一个唯一的码点。它通过 ​​UTF-8​​ 等编码方式实现,UTF-8 是一种​​变长编码​​,兼容 ASCII 的同时能高效表示各种语言字符。Unicode 提供了字符表示的​​统一标准​​,而 UTF-8 则是该标准在实践中最​​高效、最兼容、最流行​​的实现方式。 阅读详情

相关推荐

在Unicode下调用系统API函数时,要搞清楚传入的是字节长度还是字符长度

在Unicode下调用系统API函数时,要搞清楚传入的是字节长度还是字符长度

dvlinker的技术专栏 2345

汉字Unicode编码相互转换API集成指南

在国际化的背景下,字符编码的统一变得尤为重要。Unicode作为一种通用字符集标准,能够支持全球几乎所有的语言文字,包括复杂的汉字系统。对于开发人员来说,掌握如何在不同的编码格式之间进行转换是一项基本技能。本文将介绍一个专门用于汉字Unicode编码相互转换的API服务,帮助开发者轻松实现编码转换功能。通过本文的介绍,希望能帮助您快速掌握如何使用汉字Unicode编码相互转换的API。无论是个人项目还是企业应用,正确使用此类API都能有效提升项目的质量和用户体验。1.注册起零API服务平台(

爱研发/爱分享 1078

大文本读取,使用API,可转换UTF-8,Unicode编码

大文本读取,使用API,可转换UTF-8,Unicode编码 稍作修改,可以做成一个DLL文件,以备asp调用,速度超快

Windows API --- Unicode简介 2.1

对于Unicode的发展不再缀叙随着计算机的发展与不断普及,ASCII码已经不足以应对计算机全球化,因此Unicode编码应运而生。Unicode编码是16位,而ASCII码是8位,因此Unicode可以存储更多信息,以应对应对全球化并提供一个标准。另外一提 Unicode 被认为是“宽字符”,且Unicode只有一个字符集(因此避免了"二义性")。

2301_78913125的博客 1027

Unicode码转中文和中文转Unicode码的最简便的方法

只要安装了jdk,都可以转换的简单windows命令,中文转Unicode码和Unicode码转中文,简单、方便、实用。

TwinCAT 3 实战指南:从系统配置到高级运动控制

本文详细介绍了TwinCAT 3工业自动化控制平台的实战应用,从系统配置、PLC编程到EtherCAT总线配置和高级运动控制。通过倍福(Beckhoff)的TwinCAT 3平台,工程师可以高效实现复杂的工业自动化任务,包括运动控制、PLC编程等。文章还提供了常见问题排查和性能优化技巧,帮助用户提升系统稳定性和实时性。

weixin_30831529的博客 304

Win32API UNICODE编码&宽字节

Win32API UNICODE编码&宽字节 计算机是由于是美国人发明的,所以字符集先以英文为主。上世纪三十年代,满足自己的编码方式:ASC编码方式,以7位(bit)代表一个字符,能表示的字符才128个。因为以前内存很贵。128个字符足够美国人用的了。 计算机发展到欧洲,发现ASC是不够用的。就发展为ASCII 欧洲有些国家是不用英文的:如西班牙等~~ 升级ASCI...

weixin_34318956的博客 313

车辆动力学仿真模型的可信度评估方法

以转向工况测试为例,实车采集的方向盘转角作为车辆动力学模型的输入,记录车辆动力学模型的横摆角速度的输出结果,计算横摆角速度的幅频特性,根据《GB/T 6323-2014 转向盘角脉冲试验》的方法,获取横摆角速度峰值、横摆角速度谐振峰频率、横摆角速度谐振峰水平,与采集的实车结果对比,并计算车辆动力学模型和实车对于关键对比参数的相对误差。由公式(2)计算可得,在制动工况和转向工况测试下,车辆动力学模型和实车的纵向车速、制动减速度、制动距离、横摆角速度基本一致,精度> 85%,具有较好的精度。

wangchen900705的博客 1958

API入门系列之二——Unicode还是ASCII

原创文章,转载请注明作者及出处。 首发: http://blog.youkuaiyun.com/beyondcode http://www.cnblogs.com/beyond-code/ http://hi.baidu.com/beyondcode 今天,开始第二篇文章,这章我准备介绍一下Windows平台下编程中Unicode编码和ASCII编码的相关问题。 不知道各位新手朋友们遇到这

一剑之下的天空 593

视觉SLAM的前段后端最详细的梳理(硕士入门知识框架更新)

文章目录视觉SLAM的组成结构视觉里程计(VO)-特征点法 -构建稀疏点云地图-直接法 -构建稠密或半稠密的地图 --需要使用 RGB-D 传感器视觉里程计--总结:SLAM 后端研究滤波器法非线性优化后端方式的差异(有五种优化方式):单目视觉里程计的初始化:运动估计:半直接法运动估计的优化方案:关于解决累计误差的一些方法:关键帧的建图及后端优化:特征的深度估计:图优化的后端研究:视觉与IMU融合的分类:视觉与IMU的融合的优势:存在的问题:优秀的开源: 视觉SLAM的组成结构 视觉里程计(VO) -特

DC 6812

WSL2+Docker实战:在Windows上部署MinerU 2.5.3,解锁媲美Demo的VLM PDF解析能力

本文详细介绍了如何在Windows系统上通过WSL2+Docker部署MinerU 2.5.3,实现媲美Demo的VLM PDF解析能力。文章涵盖环境准备、Docker部署实战技巧及高级使用技巧,特别针对PDF识别中的复杂排版、公式和图表处理提供了优化方案,帮助用户高效处理学术论文和技术文档。

weixin_29291573的博客 482

(转)API入门系列之二 -Unicode还是ASCII

API入门系列之二 -Unicode还是ASCII 2009年03月23日 23:25:00 阅读数:4842   出处(https://blog.youkuaiyun.com/beyondcode)。   首发: http://blog.youkuaiyun.com/beyondcode http://www.cnblogs.com/beyond-code/ http://hi.baidu.com/b...

moshumu1的博客 266

详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解

声明:本文为原创文章,发表于nebulaf91的csdn博客。欢迎转载,但请务必保留本信息,注明文章出处。 本文作者: nebulaf91 本文原始地址:最大似然估计(Maximum likelihood estimation, 简称MLE)和最大后验概率估计(Maximum a posteriori estimation, 简称MAP)是很常用的两种参数估计方法,如果不理解这两种方法的思路,很

nebulaf91的博客 33万+

API入门系列之二 -Unicode还是ASCII -转载

首发 http://blog.youkuaiyun.com/beyondcode http://www.cnblogs.com/beyond-code/ http://hi.baidu.com/beyondcode 今天,开始第二篇文章,这章我准备介绍一下Windows平台下编程中Unicode编码和ASCII编码的相关问题。 不知道各位新手朋友们遇到这样的问题没有呢,新建一个Wind...

weixin_30237281的博客 99

论文阅读:Visual Relationship Detection with Language Priors

Visual Relationship Detection with Language Priors(ECCV2016) 文章   尽管大多数的relationship并不常见,但是它们的object和predicate却更频繁地独立出现。paper用这个insight分别独立训练训练object和predicate的模型,然后再进行组合来预测relationship。Visual relatio...

Kivee的博客 2877

Adams与matlab联合仿真的一些小技巧

Adams与simulink联合仿真之快速设置初值 去年到现在一直做的两个项目要用到Adams与simulnk联合仿真,虽然网上有很多这方面的教程,但都比较基本,要实现一些稍微复杂的要求就比较困难了,比如我需要改变模型的初始位姿,原来的方式是在adams中设置,再生成联合仿真需要的文件,再在matlab中进行调用和仿真,如果工况多的话这样就特别耗时耗力,进过长时间的摸索,终于找出了在matlab中直接改变Adams模型参数的方法,下面具体说明一下。 我这里的模型是一个小球通过弹簧连接在坐标原点,仿真开始后

weixin_40962901的博客 4786

UNICODE和ASCII

  软件中的字符采用UNICODE方式编码是软件走向国际化的重要一个因素,而且现代很多操作系统默认的字符编码方式都是采用UNICODE的,但是很多的库函数都是采用ASCII编码方式,以及一些第三方库也采用ASCII编码,所以字符需要在UNICODE编码以及ASCII编码之间转换,转换采用sprintf以及windows API实现。//%s String  When used with spr

World7th的专栏 2079

基于STM32设计的老人摔倒检测报警系统【升级版】(235)

在 `235 基于STM32设计的老人摔倒检测报警系统(OneNet+MQTT)` 项目基础上增加了心率、血氧、体温测量3个功能。

1511

UNICODE API的重要一步

 一、Unicode简介1、Unicode扩展自ASCII字符集。在严格的ASCII中,每个字符用7位表示,或者计算机上普遍使用的每有8位宽;而Unicode使用全16位字符集。其实也就是一个宽字符集。2、在char中一个变量只能保存一个ASCII字符,但是一个char指针可以保存多个,和数据char一样,最后一个字符是用来保存/0的。3、C中的宽字符基于wchar_t数据型态,它

xinxun的地盘 3015

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

前端需要搞懂的字符编码ASCII、Unicode、UTF8、UTF16等

在前端开发中,Javascript程序是使用Unicode字符集,Javascript源码文本通常是基于UTF-8编码。 但js代码中的字符串类型是UTF-16编码的,这也是为什么会碰到api接口返回字符串在前端出现乱码,因为多数服务都使用utf-8编码,前后编码方式不一致。...

jimojianghu的专栏 3897

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

windows下C++实现Unicode和ASCII编码的互转

UNICODE和ASCII的互相转换

r5014的博客[Eosin_Sky] 2436

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: API入门系列之一 -那‘烦人’的Windows数据类型
下一篇: API入门系列之三 -那迷惑人的Windows字符和字符指针类型
BeYoNDCoDE
博客等级 码龄18年 159粉丝 13原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值