该文件是否错误解释\ xhh

时间:2014-06-07 20:23:56

标签: tcl language-lawyer

这是来自主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错误。

1 个答案:

答案 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,那个修复是我非常高兴的事情。

很抱歉,它没有被标记为潜在的不兼容性。错过了那一个(可能是因为旧的行为被严重破坏,以至于没有人真的相信我们很久没有修复它了......)