TBy*_*yte 3 delphi char control-characters
我正在将一个非常旧的组件转换为 Delphi 12,并且偶然发现了我不记得以前见过的语法。代码有点像这样:
someBoolean := key in [^H, #32..#255];
Run Code Online (Sandbox Code Playgroud)
我知道它正在测试key指定的 ANSI 字符集是否匹配或在范围内,但到底是什么^H?H如果我更改为A, , BDelphi似乎很乐意编译该行C或 ,1。该行在 Delphi 12 和 Delphi 7 下编译。我似乎找不到任何有关此的信息。这似乎是一个非常古老的语法,可能来自 Pascal 时代。有人能解释一下吗?
我在 Delphi 7 中准备了这个测试代码:
procedure TForm1.Button1Click(Sender: TObject);
var
c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15: AnsiChar;
begin
c1 := ^A;
c2 := ^B;
c3 := ^C;
c4 := ^D;
c5 := ^E;
c6 := ^F;
c7 := ^G;
c8 := ^H;
c9 := ^Z;
c10 := ^a;
c11 := ^b;
c12 := ^0;
c13 := ^1;
c14 := ^2;
c15 := ^3;
ShowMessage(
IntToStr(Byte(c1)) + #13#10 +
IntToStr(Byte(c2)) + #13#10 +
IntToStr(Byte(c3)) + #13#10 +
IntToStr(Byte(c4)) + #13#10 +
IntToStr(Byte(c5)) + #13#10 +
IntToStr(Byte(c6)) + #13#10 +
IntToStr(Byte(c7)) + #13#10 +
IntToStr(Byte(c8)) + #13#10 +
IntToStr(Byte(c9)) + #13#10 +
IntToStr(Byte(c10)) + #13#10 +
IntToStr(Byte(c11)) + #13#10 +
IntToStr(Byte(c12)) + #13#10 +
IntToStr(Byte(c13)) + #13#10 +
IntToStr(Byte(c14)) + #13#10 +
IntToStr(Byte(c15)));
end;
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
1
2
3
4
5
6
7
8
26
1
2
112
113
114
115
所以看起来大写的字符对应于它们在字母表中的位置,但我无法告诉其他字符对应的是什么。它们与 ASCII 表中的相应值不匹配。
代表^控制键,是旧 Pascal(以及之前的 ANSI 终端)的延续。该键将与 Ctrl+H 匹配,即退格键。本质上,集合 [^H, #32..#255]包括退格键和 #32(空格)以上的任何 ASCII 字符。
ANSI 终端中的其他一些常见转义序列包括:
通用 ASCII 代码,取自Github Gist
| 姓名 | 小数 | 八进制 | 十六进制 | C-逃逸 | Ctrl 键 | 描述 |
|---|---|---|---|---|---|---|
| 贝尔 | 7 | 007 | 0x07 | \A | ^G | 航站楼铃声 |
| 学士 | 8 | 010 | 0x08 | \b | ^H | 退格键 |
| H T | 9 | 011 | 0x09 | \t | ^我 | 水平制表符 |
| 如果 | 10 | 012 | 0x0A | \n | ^J | 换行(换行) |
| 室速 | 11 | 013 | 0x0B | \v | ^K | 垂直制表符 |
| FF | 12 | 014 | 0x0C | \F | ^L | 换页(又作:新页 NP) |
| CR | 13 | 015 | 0x0D | \r | ^M | 回车符 |
| ESC键 | 27 | 033 | 0x1B | \e* | ^[ | 转义字符 |
| 德尔 | 127 | 177 | 0x7F | 删除字符 |