手持两把锟斤拷, 口中疾呼烫烫烫, 脚踏千朵屯屯屯, 笑看万物锘锘锘
� (REPLACEMENT CHARACTER, U+FFFD) - Replaces an invalid or unrecognizable character. Indicates a Unicode error.
Unicode 是一种字符集标准,UTF-8(Universal Transformation Format - 8-bit)则是一种对 Unicode 的编码方式。UTF-8 的核心思想是将 Unicode 字符映射为可变长度的字节序列,以兼容 ASCII 并支持多语言字符集。
UTF-8 编码规则
UTF-8 使用 1 到 4 个字节来表示 Unicode 字符:
| Unicode 范围 | UTF-8 编码形式 | 位数分配 |
|---|---|---|
| U+0000 ~ U+007F | 0xxxxxxx | 7 位 (1 字节) |
| U+0080 ~ U+07FF | 110xxxxx 10xxxxxx | 11 位 (2 字节) |
| U+0800 ~ U+FFFF | 1110xxxx 10xxxxxx 10xxxxxx | 16 位 (3 字节) |
| U+10000 ~ U+10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 21 位 (4 字节) |
U+FFFD范围在 U+0800 ~ U+FFFF 内,使用 3 字节 模板:1110xxxx 10xxxxxx 10xxxxxx
FFFD的二进制为1111 1111 1111 1101
根据 UTF-8 编码规范:
- 3 字节 UTF-8 模板可以容纳 16 位 数据。
- 数据从 Unicode 码点的最低有效位(LSB)开始,按以下方式分配:
| UTF-8 模板位置 | 对应的数据位 |
|---|---|
1110xxxx |
4 个最高有效位 (最高 4 位) |
10xxxxxx |
接下来的 6 位 |
10xxxxxx |
最低的 6 位 |
最后得到U+FFFD对应的utf-8的二进制为1110 1111 1011 1111 1011 1101,转换为十六进制后得到EF BF BD
锟斤拷
“�”不要怀疑,没有乱码,就是要打这个字符。“�”这个字符在Unicode字符集中表示无法显示的特殊字符,在UTF-8下,他的16进制形式是'0xEF 0xBF 0xBD'(三个字节)。
当连续两个“�”“�”字符放一起时:'0xEF 0xBF 0xBD’,‘0xEF 0xBF 0xBD'。
一旦将这个UTF-8字符转换为GBK码(两个字节),便是:‘0xEF 0xBF ’,‘0xBD 0xEF’,‘0xBF 0xBD’。 其对应的GBK字符便是:锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)。
在 Windows 平台下(特别是在使用 Visual Studio 调试版本时),未初始化的内存通常会被填充上特定的调试字节,以便更容易发现未初始化内存的错误。具体来说:
-
栈内存:调试时,编译器会将未初始化的栈内存填充为
0xCC(每个字节为 0xCC)。这与 x86 处理器中INT 3指令的机器码相同,有助于在程序执行到未初始化的栈数据时触发调试断点或中断。 -
堆内存:调试版本中,通过调用堆分配函数(如
malloc或new)申请的内存,如果未被写入,会用0xCD填充。这可以帮助检测对未初始化堆内存的错误使用。
在 Release 版本中,编译器不会自动填充这些值,内存通常保持为分配时的“脏数据”。
例如,在 Visual Studio 的 Debug 模式下,你可能会看到局部变量的值显示为“烫烫烫…”(0xCC 填充)或堆内存显示为“屯屯屯…”(0xCD 填充)。这种做法有助于调试和定位内存错误。
打印乱码:锟斤拷、烫烫烫、屯屯屯、锘锘锘_烫烫烫屯屯屯-CSDN博客
unicode - Character code of unknown character-character, e.g. square or question mark romb - Stack Overflow
Specials (Unicode block) - Wikipedia

浙公网安备 33010602011771号