这是来自主TCL文档:
\xhh The hexadecimal digits hh give an eight-bit hexadecimal value for the
Unicode character that will be inserted. Any number of hexadecimal digits may be
present; however, **all but the last two are ignored** (the result is always a
one-byte quantity).
我怀疑是这部分,all but the last two are ignored
。这是我的实验:
>set a "\x22"
"
>set a "\x2230"
"30
所以你可以看到它是前两个十六进制数字,其余的只是被视为普通字符。
我错过了什么吗?
[编辑]看起来我是对的,这里是来自tcl8.6的parser.c:
860 case 'x':
861 count += TclParseHex(p+1, (numBytes > 3) ? 2 : numBytes-2, &result);
所以只有第一个直接的2位数。很奇怪,怎么没有人发现这个doc错误。
答案 0 :(得分:1)
这是一个行为从Tcl 8.5(及之前)变为8.6的地方。这是一个错误修复,因为旧的行为是如此可怕,以至于没有人预料到它。 (或西班牙宗教裁判所,但我离题了......)
在8.6中,the documentation says:
\ X 的 HH 的
十六进制数字 hh (其中一个或两个)为将要插入的Unicode字符提供八位十六进制值。 Unicode字符的高位将为0.
在8.5中,the documentation says:
\ X 的 HH 的
十六进制数字 hh 为将要插入的Unicode字符提供八位十六进制值。可以存在任意数量的十六进制数字;但是,除了最后两个之外的所有部分都被忽略(结果总是一个字节的数量)。 Unicode字符的高位将为0.
区别很明显,8.5和8.6在这里表现不同。这一变化是由于TIP #388 “将Unicode文字扩展到BMP之后”(一般修复程序的一部分,其中一些因为对其影响而不得不推迟到8.6之后)。 ABI)于2011年9月投票通过;项目负责人是Jan Nijtmans。 我记得投票支持那个TIP,那个修复是我非常高兴的事情。
很抱歉,它没有被标记为潜在的不兼容性。错过了那一个(可能是因为旧的行为被严重破坏,以至于没有人真的相信我们很久没有修复它了......)