【发布时间】:2010-05-05 00:06:38
【问题描述】:
背景。我正在使用netlists,一般来说,人们使用/ 指定不同的层次结构。但是,实际使用 / 作为实例名称的一部分并不违法。
例如,X1/X2/X3/X4 可能在另一个名为 X1/X2/X3 的实例中引用实例 X4。或者它可能会在名为X2 的实例中引用名为X3/X4 的实例,该实例位于名为X1 的实例中。明白了吗?
确实没有“常规”字符不能用作实例名称的一部分,因此您可以使用不可打印的字符,或者......也许是标准 0 之外的字符..127 ASCII 字符。
我想我会尝试(十进制)166,因为对我来说它显示为管道:¦。
所以...我有一些 C++ 代码使用 ¦ 作为分层分隔符构造路径名,所以上面的路径看起来像 X1¦X2/X3¦X4。
现在 GUI 是用 Tcl/Tk 编写的,为了正确地将其翻译成人类可读的术语,我需要执行以下操作:
set path [getPathFromC++] ;# returns X1¦X2/X3¦X4
set humanreadable [join [split $path ¦] /]
基本上,将¦ 替换为/(我也可以使用[string map] 完成此操作)。
现在,问题是,我从 C++ 获得的字符串中的 ¦ 与我可以在 Tcl 中创建的 ¦ 不匹配。即这失败了:
set path [getPathFromC++] ;# returns X1¦X2/X3¦X4
string match $path [format X1%cX2/X3%cX4 166 166]
在视觉上,这两个字符串看起来相同,但字符串匹配失败。我什至尝试使用scan 来查看我是否混淆了位值。但是
set path [getPathFromC++] ;# returns X1¦X2/X3¦X4
set path2 [format X1%cX2/X3%cX4 166 166]
for {set i 0} {$i < [string length $path]} {incr i} {
set p [string range $path $i $i]
set p2 [string range $path2 $i $i]
scan %c $p c
scan %c $p2 c2
puts [list $p $c :::: $p2 $c2 equal? [string equal $c $c2]]
}
产生看起来所有内容都应该匹配的输出,除了 [string equal] 对带有打印行的 ¦ 字符失败:
¦ 166 :::: ¦ 166 equal? 0
不管怎样,C++中的字符定义为:
const char SEPARATOR = 166;
知道为什么常规 ASCII 范围之外的字符会像这样失败吗?当我将分隔符更改为(十进制)28(^\)时,一切正常。我只是不想在不同的平台上遇到类似的问题。 (我目前正在使用 Redhat Linux)。
【问题讨论】: