在C言语中,我们运用char来界说字符,占用一个字节,最多只能表现128个字符,也就是ASCII码中的字符。盘算机来源于美国,char 可以表现一切的英文字符,在以英语为母语的国度完整没有成绩。
然则世界上存在许多分歧的言语,例如汉语、汉语、日语等有不计其数个字符,需求用多个字节来表现,称之为宽字符(Wide Character)。Unicode 是宽字符编码的一种,曾经被古代盘算机指定为默许的编码方法,Windows 2000今后的操作零碎,包含Windows 2000、XP、Vista、Win7、Win8、Win10、Windows Phone、Windows Server 等(它们统称为 Windows NT)都从底层支撑Unicode,存取效力比 char 要高。
更多内容请检查:ASCII编码与Unicode编码

C言语中的宽字符

在C言语中,运用wchar.h头文件中的wchar_t来界说宽字符,例如:

wchar_t ch = 'A';

wchar_t 被界说为typedef unsigned short wchar_t,和一个无符号整型一样,占用两个字节。
假如界说宽字符串,需求加前缀L,例如:

wchar_t *str = L"C言语中文网";

L是必需要加的,而且与字符串之间不克不及有空格,只要如许编译器才晓得每一个字符占用两个字节。
宽字符示例:

           #include <stdio.h> #include <wchar.h> int main(){ char ch = 'A'; wchar_t wch = 'A'; char str[] = "C言语中文网"; wchar_t wstr[] = L"C言语中文网"; printf("ch=%d, wch=%d, str=%d, wstr=%d\n", sizeof(ch), sizeof(wch), sizeof(str), sizeof(wstr)); return 0; }

运转后果:
ch=1, wch=2, str=12, wstr=14
wstr 之所以比 str 多两个字节是由于:字符 'C' 占用两个字节,字符串完毕标记 '\0' 也占用两个字节。

宽字符串的长度

盘算ASCII字符串长度运用 strlen 函数,盘算宽字符串长度运用 wcslen 函数:

           #include <stdio.h> #include <wchar.h> #include <string.h> int main(){ char str[] = "C言语中文网"; wchar_t wstr[] = L"C言语中文网"; printf("strlen(str)=%d, wcslen(wstr)=%d\n", strlen(str), wcslen(wstr)); return 0; }

运转后果:
strlen(str)=11, wcslen(wstr)=6
strlen 的运转后果显然不准确,由于它把一个字节作为一个字符盘算,而 wcslen 把两个字节作为一个字符盘算。

留意:wcslen 在 string.h 和 wchar.h 头文件中均有阐明。

保护一个版本的源代码

在 Windows NT 以前的操作零碎中,乃至包含 Windows 98,对宽字符的支撑都不是很好,所以大多状况下运用ASCII编码。Windows NT 推出今后,曾经从底层支撑了Unicode,所以在 Windows NT 上的程序大多运用Unicode。
假如你愿望程序可以在各类版本的Windows操作零碎中运转,那么就需求保护两个版本的源代码,ASCII 版和 Unicode 版。ASCII 字符和 Unicode 字符的界说、运用都纷歧样,要想在一个版本的源代码中做兼容处置会十分艰苦,要做少量的任务,对程序员来说几乎是恶梦。
不外,Windows 又为我们做了一件坏事,曾经处置了兼容性成绩。它是怎样做到的呢?
例如关于字符串,ASCII 中运用 char 来界说,而 Unicode 中运用 wchar_t 来界说,而且需求添加前缀L。那么在 windows.h 头文件中(或许是它包括的其他头文件)就如许来处置:

           #ifdef UNICODEtypedef wchar_t TCHAR; #define TEXT(quote) L##quote#else typedef char TCHAR#define TEXT(quote) quote#endif

我们在源码中可以如许来运用:

TCHAR str[] = TEXT("C言语中文网");

假如是Unicode版,也就是界说了UNICODE宏,那么下面的语句等价于:

wchar_t str[] = L"C言语中文网";

假如是ASCII,也就是没有界说UNICODE宏,那么等价于:

char str[] = "C言语中文网";

在Windows中,到处可见如许的处置。固然古代操作零碎都曾经支撑Unicode,无需再思索与ASCII的兼容性成绩,然则仍然要为这些汗青成绩支付价值。
总结:因为各类各样的缘由,我们优先运用Windows界说的数据类型、宏、构造体等,如许编写的程序兼容性较好,不必思索ASCII和Unicode的成绩。但这也带来了一个应战,就是要熟习Window界说的数据类型、宏、构造体等。

转载于:https://blog.51cto.com/12009752/1843778

宽字符与Unicode相关推荐

  1. Windows核心思想-宽字符与窄字符(Unicode和ASCII)

    目录 基本概念 演示 基本概念 宽字符:Unicode字符,双字节 窄字符:ASCII字符,单字节 Windows中所有的底层函数都是Unicode编码 COM组件必须使用Unicode编码(COM组 ...

  2. C语言中宽字符和多字节字符

    C 语言原本是在英文环境中设计的,主要的字符集是7 位的ASCII 码.从此开始,8 位的byte(字节)变成最常见的字符编码单位,但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一 ...

  3. 刨根问底:C++中宽字符类型(wchar_t)的编码一定是Unicode?长度一定是16位?

    转发的:https://www.ituring.com.cn/article/111027的文章 刨根问底:C++中宽字符类型(wchar_t)的编码一定是Unicode?长度一定是16位? cons ...

  4. c++ unicode转换中文_彻底弄懂UTF-8、Unicode、宽字符、locale

    结论 宽字符类型wchar_t locale 为什么需要宽字符类型 多字节字符串和宽字符串相互转换 最近使用到了wchar_t类型,所以准备详细探究下,没想到水还挺深,网上的资料大多都是复制粘贴,只有 ...

  5. [c/c++] programming之路(25)、字符串(六)——memset,Unicode及宽字符,strset

    一.memset #include<stdio.h> #include<stdlib.h> #include<memory.h>void *mymemset(voi ...

  6. 我的YUV播放器MFC小笔记:unicode编码、宽字符

    以前的MFC工程,字符集都是基于多字节的,而现在这个工程,无意间使用unicode字符集,在其过程中,有诸多函数使用不同于以前.当然,建立项目后也是可以在项目属性中修改字符集的.这篇文章记录一下关 ...

  7. 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换...

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  8. 0宽字符加密_艺术鬼才!Unicode 字符还能这么玩?

    上周的时候,朋友圈的直升飞机不知道为什么就火了,很多朋友开着各种花式飞机带着起飞. 还没来得及了解咋回事来着,这个直升飞机就 到的微博热搜. 后面越来越多人开来他们的直升飞机,盘旋在朋友圈上方.于是很 ...

  9. Unicode编码与C语言宽字符

    文章目录 1.ASCII.ANSI.Unicode都是什么? 2.为什么需要宽字符? 3.C语言如何处理宽字符? 4.Windows中的字符串函数 1.ASCII.ANSI.Unicode都是什么? ...

最新文章

  1. Docker初学3:Docker的常用命令
  2. canvas绘制弯月
  3. 问题解决:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  4. 【渝粤教育】国家开放大学2018年春季 7407-22T药物治疗学(本) 参考试题
  5. Springboot 2.0.0单元测试
  6. 机械动作时序图怎么画_人物动作怎么画?动漫绘画人物姿势的基本画法!
  7. android中如何执行java命令
  8. UI设计素材干货模板|手机app夜间模式相关素材
  9. scrapy 的依赖库安装和出现def write(self, data, async=False):的解决方法
  10. Waves 13:一款专业电子音频制作插件和音频信号处理器插件套装
  11. 2019年保研夏令营复试经验分享(浙大软件/南大软件/南航计算机)
  12. 【板栗糖GIS】twinmotion—twinmotion如何联动sketchup
  13. R语言 AHP层次分析法——如何验证矩阵一致性
  14. 百度统计和谷歌统计文档
  15. 正则表达式给查找到的内容加引号
  16. 弘辽科技:拼多多批发单算销量吗?拼多多刚开店怎么有销量
  17. Android 消息机制(Handler运行机制)
  18. 世界首个拥有肌肉骨骼机器人问世(组图)
  19. 热爱我的热爱文章_热爱Linux的青少年的个性
  20. javascript实现下拉条联动_js实现下拉框联动

热门文章

  1. layui让当前页面刷新_layui点击按钮页面会自动刷新的解决方案
  2. Idea 新建类 快捷键
  3. linux sftp创建多用户,同一台 Centos (Linux)服务器设置多个sftp 账号,并限制用户只能访问指定文件路径...
  4. mysql字段命名_Mysql 01—数据库表字段的命名规则
  5. linux 默认组,系统自动创建的默认安全组和自己创建的安全组的默认规则
  6. c语言课程设计做科普,【图片】发几个C语言课程设计源代码(恭喜自己当上技术小吧主)【东华理工大学吧】_百度贴吧...
  7. lambda函数if_现代 C++:Lambda 表达式
  8. python docx 合并文档 图片_使用python抓取大量简历文档内数据(word:docx;pdf;图片等)输出表格文件...
  9. python异常处理_Python爬虫入门(5):URLError异常处理
  10. qgis 图片_QGIS教程09QGIS中如何制作萤火虫地图?