多字节与Unicode
编码知识
一、Unicode与多字节(ANSI )
(1)Windows中,Unicode也称为宽字节,多字节也称为窄字节; VS中默认使用Unicode编码,在项目属性>>配置属性>>常规>>字符集中可选择Unicode字符集或者多字节字符集
(2) Unicode与多字节函数版本、字符、字符串类型的区别
Win32 API中大部分参数有字符串的函数都有两个版本
| 以A结尾,代表多字节版本 | 以W结尾,代表Unicode版本 | 根据版本自动选择的 |
|---|---|---|
| 如:CreateEventA | 如:CreateEventW | 如:CreateEvent |
C运行库也有很多类似的函数
| 多字节版本 | Unicode版本 | 自适应版本 |
|---|---|---|
| strcpy | wcscpy | _tcscpy |
| strcat | wcscat | _tscscat |
| strlen | wcslen | _tcslen |
函数有两种,所以字符也有两种
| 多字节字符 | Unicode字符 | 自适应字符 |
|---|---|---|
| char | wchar_t | TCHAR |
(3) 常见Win32字符串类型
LPSTR、LPWSTR、LPTSTR、LPCTSTR
LP前缀,代表指针;STR后缀代表字符串
LPSTR:代表多字节
LPWSTR:代表Unicode
LPTSTR:T自适应
LPCTSTR:C代表const+T代表自适应
备注:变量类型使用自适应类型后如LPTSTR,相关字符串需要用TEXT()进行包裹
const char* str = "hello";
const wchar_t* wstr = L"hello";
const TCHAR* tstr = TEXT("hello");
(4)关于_T()
#ifdef _UNICODE
#define _T(X) L ## X //Unicode版本
#else
#define _T(X) X //多字节版本
#endif
(5)Unicode与多字节的选择
1.Unicode程序环境适应能力强,不会出现乱码问题
2.Unicode程序运行速度比多字节程序快。原因:Windows内部都是使用Unicode编码,多字节函数会将参数转码后交给Unicode函数
3.控制后台可使用多字节,GUI程序最好使用Unicode
二、Unicode
(1)Unicode实现方式:UTF-32
以4个byte为编码单元进行定长存储,调度器一次性下发4个byte进行存储任务
主要有两种方式:
大端法UTF-32BE:地址由小向大增加,而数据从高位往低位放 ,在网络上传输数据普遍采用的都是大端
小端法UTF-32LE:地址由小向大增加,而数据从低位往高位放,在英特尔处理器,Windows10操作系统,采用小端法。

(2)UTF-16
也有大小端模式
UTF-16 LE是windows上默认的Unicode编码方式,使用wchar_t表示。所有wchar_t *类型的字符串(包括硬编码在.h/.cpp里的字符串字面值)
char chinese[] = "你";
//大小为3个byte,一个char存储结束符,两个char存储汉字字符‘你’ 1char:1byte
wchar_t wchinese[] = L"你";
//大小为4个byte, 一个wchar_t存储结束符,一个wchar_t存储汉字字符‘你’ 1wchar_t:2byte(window下)
auto size = sizeof(chinese); // 3 byte
auto wsize = sizeof(wchinese); // 4 byte
auto len = strlen(chinese); // 2个字符(除去结束符)
auto wlen = wcslen(wchinese); // 1个字符(除去结束符)
优势:就是大多数情况下一个wchar_t表示一个字符(包括中文字符)
坑:char *类型的字面值,最终内存使用何种编码方式完全取决于当前文件的编码方式
备注:在Windows上应该铭记没有char / std::string这种类型的字符/字符串,只有wchar_t / char16_t / std::wstring / std::u16string
(3)UTF-8
优势:无字节序的概念,不用考虑大小端问题,适用与字符串的网络数据传输
劣势:如上代码,一个char并不能表示一个汉字字符,往往需要两个char
三、ANSI
(1)概念
可以认为ANSI / MBCS (多字节字符集) / 本地编码是同一个概念,不同的国家和地区制定了不同的标准,有GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准,ASCII就是美国国家的ANSI标准,一个国家的代码到另一个国家使用,有可能由于编码标准不一致,导致乱码,于是才有了万国码Unicode,各国通用。
总结

多字节与Unicode的更多相关文章
- Dll的多字节和Unicode
Dll的多字节和Unicode 分类: MFC2013-10-17 13:00 28人阅读 评论(0) 收藏 举报 dll字符集字符集多字节Unicode 我们定义dll的时候会区分: 字符集:使用多 ...
- 宽字符、多字节、unicode、utf-8、gbk编码转化
今天遇到一个编码的问题,困惑了我很长时间,所以就简要的的了解了一下常用的编码类型. 我们最常见的是assic编码,它是一种单字节编码,对多容纳256个字符. 我们在编程的时候经常遇到unicode,u ...
- 编程中的多字节和Unicode
在编译许多程序的时候,我们常常会出现诸如指针转换错误或者const char[] 不能转换成XX的错误,这时很可能就是项目编码的问题了,如果您使用的是VS编程环境,那么打开工程属性,里面就有个选项是给 ...
- _bstr_t可接受多字节、UNICODE字符串,方便用以字符集转换
使用_bstr_t需要包含的头文件: #include <comutil.h> #include <comdef.h> // test.cpp : 定义控制台应用程序的入口点. ...
- 转:Unicode字符集和多字节字符集关系
原文地址: http://my.oschina.net/alphajay/blog/5691 unicode.ucs-2.ucs-4.utf-16.utf-32.utf-8 http://stallm ...
- windows程序设计 Unicode和多字节之间转换
Unicode转多字节:WideCharToMultiByte 多字节转Unicode:MultiByteToWideChar 代码演示 #include <windows.h> int ...
- Unicode和多字节的相互转换
多字节转Unicode 四步: Step1 #include <iostream> #include "windows.h" using namespace std; ...
- Unicode字符集和多字节字符集关系
在计算机中字符通常并不是保存为图像,每个字符都是使用一个编码来表示的,而每个字符究竟使用哪个编码代表,要取决于使用哪个字符集(charset). 在最初的时候,Internet上只有一种字符集—— ...
- Unicode和多字节字符集
今天自己写的发现一个输出路径程序使用unicode字符集只能输出单个的首字符,问了一下同事,改为使用多字节字符集,问题解决了 于是上网看了他们的区别: 很多没看完,但起码了解到字符集的演变过程, 转 ...
随机推荐
- Leetcode 题目整理-1
1. Two Sum Given an array of integers, return indices of the two numbers such that they add up to a ...
- 对比PXC集群与主从架构在一致性上的区别
在上一篇文章中,已经完成了三节点PXC集群的搭建,现在搭建node3的从库node4,并且有如下测试: 搭建node3的从库,代号node4 测试1: 先断开node3节点,然后在node1构造数据, ...
- 我的一个git(码云)之旅
合作开发项目,你就会用到git,现在码云比较简单,因为是中文化界面,学习起来难度比较低,又支持5人以下项目免费,所以学习码云更好入手一点. 下面的东西适合一些个基础比较低的用户学习,因为我就是啊... ...
- Magicodes.IE在Docker中使用
Magicodes.IE在Docker中使用 更新日志 2019.02.13 [Nuget]版本更新到2.0.2 [导入]修复单列导入的Bug,单元测试"OneColumnImporter_ ...
- C# WinForm 使用SMS接口发送手机验证码+图形验证码+IP限制
https://blog.csdn.net/IT_xiao_guang_guang/article/details/104299983 前言 1.发送手机验证码用的是网建的SMS接口(http:/ ...
- Net Core 中WebAPI有关 Session的设置,及获取
步骤一: 在Startup 文件中做相应的设置 ConfigureServices方法里添加 //ConfigureServices添加: services.AddSession(options =& ...
- Go语言实现:【剑指offer】整数中1出现的次数(从1到n整数中1出现的次数)
该题目来源于牛客网<剑指offer>专题. 求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1.10.1 ...
- win10系统安装VMware虚拟机软件以及linux系统
一.安装VMware 1.在VMware官网下载VMware Workstation Pro 15.5.1 下载地址:https://my.vmware.com/cn/web/vmware/detai ...
- MySQL的简介
什么是数据库 1. 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同 的API(接口)用于创建,访问,管理,搜索和复制所保存的数据 2. 我们也可以将 ...
- 怎么理解Laravel的核心架构
使用过larave框架的朋友都知道laravel框架里面除了提供一些基本的功能(如控制器.视图.模型)之外,还有中间件.门面.契约等,这些东西是如何在laravel框架运用起来的呢?今天就和大家详聊一 ...