字节
char
char
是c++
里面基本的字符类型,通常用来表示单个字节- 这大多数现代系统中,一个
char
占用1个字节,1个字节是8个位 char
可以用来表示ascii
字符集中的字符,其中每个字符都可以用一个字节来表示ascii
编码覆盖了英文字母、数字和一些基本的符号- 但是在全球范围内,有很多其他的字符和符号,
assic
就不足以满足了
因为上面也说了,1个字节是8个位,而每个位可以表示的情况有0和1这两种 - 而
ascii
是使用了7个位来表示一个字符,而7个位最多就是128个字符
多字节
- 上面描述的这种“不够用”的情况下,多字节是另外一种编码形式,用以解决这种不够用的情况
- 比如
gb2312
,big5
,jis
等各国地区各自编写的编码标准
- 比如
- 特点是单子字符可能由多个字节来表示
- 比如
gb2312
,big5
使用2个字节来表示一个汉字
- 比如
- 问题1
- 这种各自编码的字符集之间存在互不兼容的情况,同一个编码值,在不同的编码标准里面,表示不同的字符
- 解决1
- 为解决上面的问题,就有了
unicode
unicode
通常用两个字节表示一个字符,也就是它可以存65535
个字符,现在是够用了- 但是也引出了其他的效率问题,如下
- 为解决上面的问题,就有了
- 问题2
- 如果将所有字符在
unicode
里面都用两个字节来表示,对以前在ascii
里面的那些简单的字符,如英文字母、数字等存储,效率就有问题了 - 虽然可以把高位全部填0来表示,但是它以前只需要1个字节就够了,现在却需要用2个字节
- 如果将所有字符在
- 解决2
- 为了解决上面的问题,就有了
utf-8
- 它的特点是它可以根据不同的符号自动选择不同的编码,比如英文字母,它用一个字节就够了
- 为了解决上面的问题,就有了
UTF-8
- 是一种广泛使用的
Unicode
字符编码 - 它是一种变长编码,可以使用 1 到 4 个字节来表示一个字符
UTF-8
被设计成与传统的 ASCII 编码兼容UTF-8
没有字节顺序问题,因为即使在多字节字符中,其字节序列也是明确定义的- 普通的
UTF-8
文件不包含BOM
- 这意味着文件以实际的文本内容开始,没有特定的标记来指明其编码
UTF-8 BOM
- 在文件开头包含一个特殊的字节序列(
BOM
),即EF BB BF
BOM
在这里用作一个标记,表明该文件是用UTF-8
编码的- 虽然在
UTF-8
中不需要用于字节顺序的标记,BOM
仍可用于表示编码类型
- 虽然在
- 在某些情况下(尤其是在
Windows
环境中),UTF-8 BOM
可用于帮助软件确定文件的正确编码
宽字节
- 一般指
unicode
编码的字符集- 某种程度上,可以理解为宽字节就是多字节
c++
里面用char
,char16_t
,char32_t
分别表示无符号8位整数,无符号16位整数,无符号32位整数utf-8
,utf-16
,utf-32
分别以它们作为编码单位- 比如,汉字在不同的编码里占不同的字节
utf-8
:3个char
,共3个字节utf-16
:2个char16_t
,共4个字节utf-32
:2个char32_t
,共8个字节
默认编码
1 |
std::string str = "这里是中文汉字"; |
- 在
c++
里面,字符串字面量的默认编码取决于编译器和系统的配置- 在现代大多数的编译器和系统中,默认的编码通常是
utf-8
- 在一些老旧或者特定区域设置的系统中,可能使用本地编码,如
gbk
,big5
等
- 在现代大多数的编译器和系统中,默认的编码通常是
- 如果源文件被保存为
utf-8
编码,并且编译器默认或被配置为utf-8
编码,那么字符串字面量也被视为utf-8
编码 - 一些编译器可能允许通过命令行选项或项目设置指定源代码的编码
- 其他编码,汉字占字节:
utf-8
:3个字节gbk
:2个字节big5
:2个字节
查看编码
Windows
1 2 3 4 5 |
// cmd chcp // powershell [Console]::OutputEncoding |
macOS,Linux
1 |
echo $LANG |
1 |
locale |
中文存储
std::string
- 当前环境是
utf-8
编码,每个汉字占了3个字节 gbk
环境是2个字节
- 当前环境是
1 2 3 4 5 6 7 8 |
std::string str = "这里是一串中文汉字"; std::cout << str.size() << " " << str.length() << std::endl; // utf-8 // 27 27 // gbk // 18 18 |
std::wstring
- 当前环境是
utf-8
编码,每个汉字占了3个字节
- 当前环境是
1 2 3 4 5 6 7 8 |
std::wstring wstr = L"这里是一串中文汉字"; std::cout << wstr.size() << " " << wstr.length() << std::endl; // utf-8 // 9 9 // gbk // 9 9 |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Windows线程同步相关03/10
- ♥ Windows 核心编程 _ 创建&&终止线程07/02
- ♥ WTL 概述03/10
- ♥ Dump分析:空指针访问二,重复释放堆内存二03/30
- ♥ Bkwin一12/01
- ♥ SOUI源码:log4z06/24