多字节
指用多个字节来表示一个字符的字符编码集合。一般英文字母用
1Byte
,汉语等用2Byte
来表示。
发展
一开始
internet
上只有一种字符集,ANSI
的ASCII
字符集,它使用7 bits
表示一个字符,总共能表示128个字符,这些字符里包括了英文字母,数字,标点符号等常用字符。
后来
ASCII
不够用了,因为除了那些常用字符,还有不同国家不同地区各自使用的字符,为了满足这种需求,衍生出了GB2312
,BIG5
,JIS
等各国家地区各自编写的诸多编码标准。这些标准使用2个字节表示一个字符的各种汉字延伸的编码方式,称为
ANSI
编码,又称多字节字符集。但是呢,这些不同的
ANSI
字符集之间互不兼容,同一个编码值,可能在不同的编码体系中代表着不同的字。也就是说无法将不同语言的文字,储存在同一段ANSI
编码的文本中。
再后来
为了解决上述问题,
unicode
就诞生了。
unicode
通常用两个字节表示一个字符,也就是他这种标准可以存65535个字符,那这样对于全世界的文字符号来说,是够用的。但是呢,也有新的问题产生,那就是,像那些原有的英文字符,虽然把对应的高位全部填为0就可以了。但是实质上这种方式的效率是不高的,比如英文字母本来是单字节就可以表示的,现在却变成了双字节了。为了解决这种效率问题,
UTF-8
就出现了。
它之所以解决了上面讲的问题,是因为它可以根据不同的符号自动选择编码的长短。比如英文字母,它只用一个字节就够了。
宽字节
一般指
unicode
编码的字符集
UTF
用
char
,char16_t
,char32_t
分别表示无符号8位整数,无符号16位整数,无符号32位整数。
而UTF-8
,UTF-16
,UTF-32
则分别以char
,char16_t
,char32_t
作为编码单位。如:汉字
UTF-8
- 3个字节
UTF-16
- 2个
char16_t
,共4个字节UTF-32
- 2个
char32_t
,共8个字节
函数
多字节-宽字节
1 2 3 4 5 6 7 8 9 10 |
//windows提供的接口 #include <windows.h> #include <wchar.h> int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cchMultiByte, LPWSTR lpWideCharStr, int cchWideChar); |
Value | Describe |
CP_ACP | ANSI code page |
CP_MACCP | Not supported |
CP_OEMCP | OEM code page |
CP_SYMBOL | Not supported |
CP_THREAD_ACP | Not supported |
CP_UTF7 | UTF-7 code page |
CP_UTF8 | UTF-8 code page |
MB_PRECOMPOSED | 通常使用预作字符 |
MB_COMPOSITE | 通常使用组合字符 |
MB_ERR_INVALID_CHARS | 如果函数遇到无效的输入字符,它将运行失败,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION值 |
MB_USEGLYPHCHARS | 使用象形文字替代控制字符 |
- 指向待转换的字符串的缓冲区
- 指定由参数
lpMultiByteStr
指向的字符串中字节的个数。可以设置为-1,会自动判断lpMultiByteStr
指定的字符串的长度 - 指向接收被转换字符串的缓冲区
- 指定由参数
lpWideCharStr
指向的缓冲区的宽字节数。若此值为0,函数不会执行转换,而是返回目标缓存lpWideChatStr
所需的宽字符数
宽字节-多字节
1 2 3 4 5 6 7 8 9 10 11 12 |
//windows提供的接口 #include <windows.h> #include <wchar.h> int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cchMultiByte, LPCSTR lpDefaultChar, LPBOOL pfUsedDefaultChar); |
lpDefaultChar和pfUsedDefaultChar
只有当
WideCharToMultiByte
函数遇到一个宽字节字符,而该字符在uCodePage
参数标识的代码页中并没有它的表示法时,WideCharToMultiByte
函数才使用这两个参数。(通常都取值为NULL)
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Dump分析:堆内存泄露03/29
- ♥ X86_64汇编学习记述三08/08
- ♥ x86_64汇编学习记述二08/07
- ♥ X86_64汇编学习记述四08/09
- ♥ Windows 核心编程 _ 进程一06/07
- ♥ Windbg:命令实践详解二03/28