编码知识

一、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,各国通用。

总结

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 #include // test.cpp : 定义控制台应用程序的入口点. ...

转:Unicode字符集和多字节字符集关系

c语言字符集改为多字节,多字节与Unicode相关推荐

  1. C/C++语言拾遗(三)-多字节字符和Unicode

    MFC字符集选项 MFC字符集选项 Unicode Character Set与Multi-Byte Character Set有什么区别呢? Multi-Byte Character Set一般是 ...

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

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

  3. 使用 _tprintf 宏兼容多字节字符集和Unicode字符集

    我们知道在windows平台上写C程序要考虑字符编码问题,为了兼容多字节字符集和Unicode,涉及字符,字符串操作,都要用TEXT宏围起来. 如果要使用printf,但是不确定字符集,可以使用 _t ...

  4. Visual Studio——理解多字节编码与Unicode码

    多字节字符与宽字节字符 char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char.wchar_t.  char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因为它表 ...

  5. Visual Studio——多字节编码与Unicode码

    多字节字符与宽字节字符 1) char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char.wchar_t.  char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因 ...

  6. oracle如何把字符集改回默认,更改oracle字符集

    在安装oracle时,选了默认字符集是utf8,后来发现与plsql developer工具联合使用时,会出现各种乱码问题.再加上我的项目也是gbk的,因此,将字符集改成gbk试试. 步骤如下: 1. ...

  7. shell 编程--shell的扩展功能(字符串切割与掐头去尾)、通配符、设置语言字符集

    一.通配符 1)通配符 通配符 描述 * 匹配任意字符串 ? 匹配任意单个字符 [-] 匹配括号中的任意单个字符,使用-可以表示连续的字符:[ 后面使用!或^ 表示匹配不在括号中的所有其他内容:[] ...

  8. Win11怎么改系统语言?Win11系统语言简体改繁体的方法

    Win11怎么改系统语言?有时候我们电脑下载安装系统之后,发现该系统语言不是自己常用的,因此还需要更换系统语言,那么应该如何操作呢?今天小编就为大家带来Win11系统语言简体改繁体的方法,而且用类似的 ...

  9. oracle是否支持gb18030,将oracle字符集改成GB18030

    将oracle字符集改成GB18030 (2011-06-29 14:16:05) 转载▼ 标签: 数据库 字符集 oracle gb18030 ora-12712 it 1.以管理员身份进入数据库 ...

最新文章

  1. PHP autoload 函数
  2. Python RPi GPIO编程控制
  3. 数组反向遍历ios_LeetCode106.从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inor...)...
  4. pycharm控制台调试程序
  5. saltstack安装
  6. storm 机器上日志查询_Storm原理与实践大数据技术栈14
  7. 浅谈MaxCompute资源规划管理及评估
  8. 韩国小哥哥用Pytorch实现谷歌最强NLP预训练模型BERT | 代码
  9. c语言编程sinx泰勒公式_大白话5分钟带你走进人工智能-第12节梯度下降之原理泰勒公式(7)...
  10. 爬虫开发python工具包介绍 (4)
  11. matlab中求特征值的eig函数说明
  12. iOS 升级HTTPS配置ATS-----(1)------
  13. 《麦田里的守望者》感
  14. 【操作系统】操作系统的功能管理与分类
  15. CZ880到手第一天测试,安装Windows11 To Go
  16. Linux userdel 和 deluser 的区别
  17. 外罚函数法(一):外罚函数的构造
  18. ICE之——IceGrid负载均衡部署
  19. 网络数据传输的安全基础
  20. Chome和Edge通过组策略配置IE模式和总是允许Flash(官方方案)

热门文章

  1. 新汉兰达导航linux系统,车载导航使用手册 体验新汉兰达原厂导航
  2. 算法梳理:随机森林算法梳理
  3. 使用FFmpeg把视频转换成JPG格式的图片
  4. x86 PerCPU变量基址(gs寄存器)的原理
  5. 天翼云赋能工业行业 安全上云更有保障
  6. 11:C语言之求sn=a+aa+aaa+aaaa+......的值
  7. 蓝牙资讯|苹果获得智能戒指专利,可用于交互 AR / VR 头显设备
  8. 人形机器人视觉处理——垃圾分类
  9. python爬虫爬取必应每日高清壁纸
  10. SassScript