1、简介

Unicode是ASCII(美国信息交换标准码)字符编码的一个扩展。ASCII中每个字符用7位表示,计算机上每个字符8位。Unicode使用全16为字符编码,因此Unicode能表示世界上所有能用于计算机通讯的符号。Unicode最初是作为ASCII的补充。ASCII最终有26个小写/大写字母、10个数字、32个符号、33个控制代码和一个空格,共128个代码。

1、优点

大小写字符的代码是连续的
大小写字母可以通过改变一位数据相互转换

为了兼容不同国家的语言,需要考虑如何确认和ASCII的兼容。因此引入了双字节字符集(DBCS),使用2个字节定义一个字符,通常是复杂的象形文字。还存在一个问题,不同的国家有一个象形文字是相同的,但语言是不同,因此Windwos支持4个不同的双字节字符集:代码页932(日文)、936(简体中文)、949(朝鲜文)和950(繁体中文),为这些国家生产的Windows版本才支持双字节字符集。

双字符集不是说字符是由2个字节代表,字符串中的字符数不能由字符串的字节数决定,必须剖析字符串来决定其长度,而且必须检查每个字节以确定它是否属实双字节字符的首字节。
Unicode的缺点:Unicode字符串占用的内存是ASCII字符串的两倍
Intel微处理器是先从最低位字节开始存储多字节数值的,如果一个双字节值0x0042,实际上是以0x42、0x00的顺序保存在内存中。在检查Unicode文本的计算机存储时应注意这一点。如

wchar_t* pData = L"我是中国人 test";
wchar_t szStr = L'A';

这里的L表示long,告诉编译器这个字符串按宽字符保存(每个字符占用2个字节),L是非常重要的,在2个符号之间必须没有空格,如果不小心忘记了L,编译器会告警。

2、宽字符库函数

 const char* pData = "Hello我";int nSize = strlen(pData); //7wchar_t* pData1 = L"Hello我";nSize = wcslen(pData1);      //6

const char* pData这样的指针,我们可以通过strlen函数获取到字符串中的字符数,不包含\0。
当strlen的参数是wchar_t类型的时候,VS2008会提示错误:

error C2440: 'initializing' : cannot convert from 'const char [6]' to 'wchar_t *'
error C2664: 'strlen' : cannot convert parameter 1 from 'wchar_t *' to 'const char *'

如果没有错误提示,能正常运行程序的情况下,字符串长度可能与实际不符,因为Intel处理器是从低位开始的,0x48 0x65 0x6C 0x6C 0x6F在内存是: 48 00 65 00 6C 00 6C 00 6F 00。strlen把第1个字符作为字符开始计数,下一个字节是0,就标识字符串结束。
运行时库函数是在链接时添加的,因此可能会不同于我们所希望的那样运行改成宽字节后,字符串的字符长度不改变,只是字节长度改变了
在实际开发中,我们也许希望项目既能按ACII编译又能按Unicode编译,这个时候怎么办呢?运行库函数不同的编译方式的函数名称不同,是否也要定义不同的字符?这个问题已经被解决了,我们在代码中包含TCHAR.H头文件即可。因其不是标准ANSI C的一部分,因此定义的每个函数和宏定义的前面都有下划线,为字符串参数的标准运行库函数提供一系列的替代名称,这样就可以实现指向函数的Unicode版本也可以指向非Unicode版本。

这里注意一下L的定义,如下

#define __T(x)      L ## x

这里的# #是粘贴符号,意思是将字母L添加到宏参数上。

其他

1、ASCII最初使用7位的原因
ASCII代码有128个,2的7次方刚好128,可以满足需要
在当时的环境下,6位不能满足需求,8位的价格太贵
2、unicode和dbcs的区别
ASCII是一个字节,但是Unicode可不一定就是两个字节
ASCII只能表示英文数字和常用标点符号,编码在1-127之间,Unicode可以表示所有字符,编码范围很大

Unicode字符编码相关推荐

  1. Unicode字符编码分布表[全部]

    Unicode字符编码分布表[全部] |字号 订阅 Unicode字符编码分布表――语言文字类 欧洲字母 非洲文字 印度文字 东亚文字 中亚文字 (查阅组合·标记字符) 埃塞俄比亚文字 孟加拉字符(U ...

  2. Unicode字符编码规范

    http://www.aoxiang.org 2006-4-2 10:48:02 Unicode是一种字符编码规范 . 先从ASCII说起.ASCII是用来表示英文字符的一种编码规范,每个ASCII字 ...

  3. ascii码 iso 8859-1 Unicode 字符编码 UTF8编码 区别 表格

    第一:编码简单描述 一.ASCII码:美国佬最初把自己的语言用计算表示,发现 0--127  能把字母表+其它符号全能表示出来 二.  iso 8859-1:欧洲人,0---127 是ASCII码,1 ...

  4. python:Unicode字符编码

    ord()函数:表示的是对单个 Unicode 字符的字符串,返回代表它 Unicode 码点的整数,例如 ord('a') 返回整数 97, ord('€') (欧元符号)返回 8364 .这是 c ...

  5. php 韩文乱码转换,Unicode字符编码之十进制韩文转为字符

    字符串中出现韩文没能正常显示,在网页中显示了这样的十进制字符: 标题-어디부터 어디까지 期望韩文能正常显示出来: 标题-어디부터 어디까지 韩文的unicode范围 韩文字母 (1100–11FF) ...

  6. [CPP]--Unicode 字符编码

    文章目录 1. 内容待续 2. Reference 1. 内容待续 2. Reference 谈编码与 Unicode 标准 csdn 彻底弄懂 Unicode 编码 csdn

  7. ASCII码对照表(C++17 实现ANSI、UTF8、Unicode字符编码互转)

  8. GB2312、GBK、BIG5、Unicode及字符编码基础知识

    GB2312.GBK.BIG5.Unicode及字符编码基础知识 在搜狗的设置里面有个选项,要用户选择使用GBK还是GB2312,论坛里面常常有人要求输入法支持BIG5编码,也有人提到 Unicode ...

  9. Python笔记:字符编码unicode/utf-8

    版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. Unicode和Python的中文处理 ...

  10. 详解Unicode和JavaScript字符编码

    Unicode Unicode,又称万国码.统一码和国际码,是由统一码联盟制定的一套规范统一的字符编码集,其设计意图是将世界上所有字符都包含在其中,它使用特定的十六进制编号来表示字符,每一个特定十六进 ...

最新文章

  1. 深入理解 wpa_supplicant(四)
  2. 【Dual-Path-RNN-Pytorch源码分析】model的架构图
  3. 【队列源码研究】消息队列beanstalkd源码详解
  4. 数据库系统概念总结:第三章 SQL
  5. mysql 入门 jdbc
  6. 华为或正与联发科、紫光展锐就采购更多芯片事宜展开磋商
  7. 【Python-3.5】matplotlib绘制气温折线图
  8. 转 如何通过ildasm/ilasm修改assembly的IL代码
  9. 绝大多数人努力程度之低,根本轮不上拼天赋
  10. 【电源专题】BUCK电源效率和输出电压的关系
  11. PS和AE、PR的区别是什么?
  12. 解决:3Dmax 渲染后任意点击就卡住不能点击,UI界面冻结
  13. 轻松构建自己的Python开发环境,进入机器学习新世界
  14. android webView 全屏播放网络视频
  15. 女性内分泌失调的8种症状
  16. sql 语句 还原数据库
  17. 独立服务器和vps的区别
  18. 百度在40所高校办了AI俱乐部,俱乐部还百度一堆黑科技
  19. AE基础之添加点、线、面要素
  20. 基于java的商品价格查询系统

热门文章

  1. 01-微信小程序商城 商城框架的制作(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)
  2. Springboot实现销售团队管理系统
  3. Ubuntu 安装fish
  4. linux文本编辑器字体大小,怎样将Linux中gcc文本编辑器的字体放大
  5. html购物车结算代码,JavaScript购物车结算案例
  6. 咖说丨破碎的互联网下,加密技术正在恢复数据主权!
  7. Linux下7款最佳的开源视频播放器
  8. 安装AX2012R3流程
  9. ubb码转换的java类库 ubb2html_ubb代码转换为html
  10. mysql是应用软件还是系统软件_数据库管理系统属于应用软件吗?