003 C++的字符类型(Character Types)


作者Lou Xiao, deepseek创建时间2025-04-02 06:51:15更新时间2025-04-02 06:51:15

1. 基本字符类型

1.1 char

大小: 通常1字节(8位)
范围:
- 有符号: -128 到 127
- 无符号: 0 到 255
用途: 存储ASCII字符或小整数
示例:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 char ch = 'A';
2 char num = 65; // 等同于'A'的ASCII码

1.2 wchar_t

大小: 实现定义(通常2或4字节)
用途: 存储宽字符,用于扩展字符集
示例:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 wchar_t wch = L'你';

1.3 char16_t (C++11)

大小: 2字节(16位)
用途: UTF-16编码的Unicode字符
示例:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 char16_t utf16ch = u'好';

1.4 char32_t (C++11)

大小: 4字节(32位)
用途: UTF-32编码的Unicode字符
示例:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 char32_t utf32ch = U'😊';

2. 字符字面量

类型前缀示例说明
char'A'ASCII字符
wchar_tLL'你'宽字符
char16_tuu'字'UTF-16字符
char32_tUU'🐱'UTF-32字符
转义序列'\n', '\x41'特殊字符表示

3. 转义序列

3.1 常用转义序列

  • \n: 换行
  • \t: 水平制表符
  • \\: 反斜杠
  • \': 单引号
  • \": 双引号
  • \0: 空字符(null)

3.2 数字转义序列

  • \xhh: 十六进制表示(如'\x41'是'A')
  • \ooo: 八进制表示(如'\101'是'A')

4. 字符处理函数(<cctype>

函数描述
isalnum(c)检查是否为字母或数字
isalpha(c)检查是否为字母
isdigit(c)检查是否为数字
islower(c)检查是否为小写字母
isupper(c)检查是否为大写字母
tolower(c)转换为小写
toupper(c)转换为大写
isspace(c)检查是否为空白字符

4.2 字符比较

  • 可直接使用关系运算符: ==, !=, <, >
  • 比较基于字符的ASCII码值

5. 字符与整数关系

字符本质上是小整数

5.1 隐式转换

  • 较小的整数类型可以隐式转换为较大的整数类型
  • 字符类型可以隐式转换为整数类型

5.2 显式转换

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 char c = 'A';
2 int i = static_cast<int>(c); // C++风格转换
3 int j = (int)c; // C风格转换

可进行算术运算:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 char c = 'A';
2 c = c + 1; // c现在为'B'

类型转换:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 int i = 'A'; // i = 65
2 char c = 65; // c = 'A'

6. 字符串与字符数组

6.1 C风格字符串

以空字符('\0')结尾的字符数组
示例:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 char str[] = "Hello"; // 自动添加'\0'
2 char str2[] = {'H', 'e', 'l', 'l', 'o', '\0'};

6.2 std::string (C++字符串类)

更安全方便的字符串处理
示例:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 #include <string>
2 std::string s = "Hello";
3 s += '!'; // 添加字符

7. Unicode支持(C++11及以后)

7.1 编码前缀

  • UTF-8: u8 (如 u8"你好")
  • UTF-16: u (如 u"你好")
  • UTF-32: U (如 U"你好")
  • 宽字符: L (如 L"你好")

7.2 Unicode字面量

通用字符名: \uXXXX (16位) 或 \UXXXXXXXX (32位)

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 char32_t heart = U'\U00002764'; // ❤

7.3 字符编码注意事项

  1. ASCII:标准7位编码(0-127)
  2. 扩展ASCII:使用8位(0-255)
  3. UTF-8:可变长度Unicode编码(1-4字节)
  4. UTF-16:16位Unicode编码
  5. UTF-32:32位Unicode编码

8. 字符类型选择指南

使用场景推荐类型
ASCII字符处理char
本地化宽字符(Windows)wchar_t
跨平台Unicode(16位)char16_t
跨平台Unicode(32位)char32_t
现代C++字符串处理std::string

9. 最佳实践

  1. 明确字符类型的符号性:signed char sc; unsigned char uc;
  2. 处理国际化文本时使用char16_tchar32_t
  3. 优先使用std::stringstd::wstring而非C风格字符串
  4. 处理Unicode时明确指定编码类型,进行字符操作时考虑本地化设置
  5. 使用标准库函数而非手动处理字符转换
  6. 使用static_cast进行显式字符类型转换

10. 常见陷阱

10.1. 有符号/无符号混淆:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 char c = 200; // 可能溢出(如果char是有符号的)

10.2 忘记空终止符:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 char str[] = {'H', 'i'}; // 不是有效的C字符串

10.3 窄/宽字符混淆:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 std::string s = L"宽字符"; // 错误类型

10.4 区域设置影响:

isalpha()等函数的结果可能依赖区域设置

10.5 UTF-8多字节字符:

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 char u8str[] = u8"你好";
2 // sizeof(u8str) != 字符数(因为UTF-8是多字节编码)

11. 示例代码

1.双击鼠标左键复制此行;2.单击复制所有代码。
                                
                                    
1 #include <iostream>
2 #include <cctype>
3 #include <string>
4
5 int main() {
6 // 基本字符类型
7 char c = 'A';
8 wchar_t wc = L'你';
9 char16_t c16 = u'字';
10 char32_t c32 = U'🐱';
11
12 // 字符串字面量
13 const char* str = "Hello";
14 const wchar_t* wstr = L"你好";
15 const char16_t* str16 = u"UTF-16";
16 const char32_t* str32 = U"UTF-32";
17
18 // 字符处理
19 std::cout << "isalpha('A'): " << isalpha('A') << '\n';
20 std::cout << "tolower('A'): " << (char)tolower('A') << '\n';
21
22 // 原始字符串
23 const char* raw_str = R"(Line1\nLine2)"; // 包含字面\n
24
25 return 0;
26 }
文章目录