在应用服务日志中看到了服务器日志记录错误NumberFormatExeception input string ^@^@^@^@,对于 ^@ 这个控制字符没有什么映像了于是vi打开一个临时文件 ctrl + V, ctrl + @ 输入到文件中然后hexdump 看了一下二进制内容发现是
0000000 0a00
0000002
本来输入一个字符变成两个了, (不过当时错误判断这个值就是0xa了换行符) 。vi编辑的时候会自动向文件中插入LF。可以输入其他字符比如a,结果是下面这样。
0000000 0a61
0000002
下面程序打印了ascii码, 1-31,127是控制字符
#include <stdio.h>
void print_control_char(char c) {
// 打印控制字符的可见形式
if (c >= 0 && c <= 31) {
printf("^%c", c + 64); // 显示为 ^@, ^A, ..., ^Z 等
} else if (c == 127) {
printf("^?"); // DEL字符显示为 ^?
} else {
printf(" "); // 非控制字符为空
}
}
int main() {
printf("+-----+--------+--------+--------------+\n");
printf("| Dec | Hex | Char | Visible Form |\n");
printf("+-----+--------+--------+--------------+\n");
// 打印所有控制字符 (0-31, 127)
for (int i = 0; i <= 127; i++) {
if (i <= 31 || i == 127) {
// 构造可见形式的字符串
char visibleForm[4] = " "; // 初始化为空字符串
if (i <= 31) {
visibleForm[0] = '^';
visibleForm[1] = i + 64; // 转换为可见形式(如 ^A)
} else if (i == 127) {
visibleForm[0] = '^';
visibleForm[1] = '?'; // DEL字符的可见形式为 ^?
}
// 打印表格行
printf("| %3d | 0x%02X | %c | %-12s |\n",
i, i, (i == 127 ? '?' : ' '), visibleForm);
printf("+-----+--------+--------+--------------+\n");
}
}
return 0;
}
输出结果
+-----+--------+--------+--------------+
| Dec | Hex | Char | Visible Form |
+-----+--------+--------+--------------+
| 0 | 0x00 | | ^@ |
+-----+--------+--------+--------------+
| 1 | 0x01 | | ^A |
+-----+--------+--------+--------------+
| 2 | 0x02 | | ^B |
+-----+--------+--------+--------------+
| 3 | 0x03 | | ^C |
+-----+--------+--------+--------------+
| 4 | 0x04 | | ^D |
+-----+--------+--------+--------------+
| 5 | 0x05 | | ^E |
+-----+--------+--------+--------------+
| 6 | 0x06 | | ^F |
+-----+--------+--------+--------------+
| 7 | 0x07 | | ^G |
+-----+--------+--------+--------------+
| 8 | 0x08 | | ^H |
+-----+--------+--------+--------------+
| 9 | 0x09 | | ^I |
+-----+--------+--------+--------------+
| 10 | 0x0A | | ^J |
+-----+--------+--------+--------------+
| 11 | 0x0B | | ^K |
+-----+--------+--------+--------------+
| 12 | 0x0C | | ^L |
+-----+--------+--------+--------------+
| 13 | 0x0D | | ^M |
+-----+--------+--------+--------------+
| 14 | 0x0E | | ^N |
+-----+--------+--------+--------------+
| 15 | 0x0F | | ^O |
+-----+--------+--------+--------------+
| 16 | 0x10 | | ^P |
+-----+--------+--------+--------------+
| 17 | 0x11 | | ^Q |
+-----+--------+--------+--------------+
| 18 | 0x12 | | ^R |
+-----+--------+--------+--------------+
| 19 | 0x13 | | ^S |
+-----+--------+--------+--------------+
| 20 | 0x14 | | ^T |
+-----+--------+--------+--------------+
| 21 | 0x15 | | ^U |
+-----+--------+--------+--------------+
| 22 | 0x16 | | ^V |
+-----+--------+--------+--------------+
| 23 | 0x17 | | ^W |
+-----+--------+--------+--------------+
| 24 | 0x18 | | ^X |
+-----+--------+--------+--------------+
| 25 | 0x19 | | ^Y |
+-----+--------+--------+--------------+
| 26 | 0x1A | | ^Z |
+-----+--------+--------+--------------+
| 27 | 0x1B | | ^[ |
+-----+--------+--------+--------------+
| 28 | 0x1C | | ^\ |
+-----+--------+--------+--------------+
| 29 | 0x1D | | ^] |
+-----+--------+--------+--------------+
| 30 | 0x1E | | ^^ |
+-----+--------+--------+--------------+
| 31 | 0x1F | | ^_ |
+-----+--------+--------+--------------+
| 127 | 0x7F | ? | ^? |
+-----+--------+--------+--------------+
除了ascii码中的控制字符,类似的还有
C1控制字符
C1控制字符的范围是128–159(十六进制80–9F),主要用于显示器和打印机。
ISO 8859独特字符
不间断空格(NBSP)和软连字符(SHY), 在属性上类似于控制字符,但在ISO 8859中并未真正被定义为控制字符
参考及引用
https://www.geeksforgeeks.org/control-characters/
图片from林如