背景.我正在使用网表,一般来说,人们通过使用指定不同的层次结构/.但是,实际使用a /作为实例名称的一部分并不违法.
例如,X1/X2/X3/X4可能引用X4另一个名为的实例内的实例X1/X2/X3.或者它可能引用名为X3/X4在名为的实例X2内命名的实例内的实例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 ¦] /]
Run Code Online (Sandbox Code Playgroud)
基本上,替换¦用/(我也可以用做到这一点[string map]).
现在,问题是,¦我从C++获得的字符串与¦我在Tcl中创建的字符串不匹配.即失败:
set path [getPathFromC++] ;# returns X1¦X2/X3¦X4
string match $path [format X1%cX2/X3%cX4 166 166]
Run Code Online (Sandbox Code Playgroud)
在视觉上,两个字符串看起来相同,但字符串匹配失败.我甚至尝试使用扫描来查看我是否混淆了位值.但
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]]
}
Run Code Online (Sandbox Code Playgroud)
产生看起来应该匹配的输出,除了带有打印行[string equal]的¦字符失败:
¦ 166 :::: ¦ 166 equal? 0
Run Code Online (Sandbox Code Playgroud)
对于它的价值,C++中的字符定义为:
const char SEPARATOR = 166;
Run Code Online (Sandbox Code Playgroud)
任何想法为什么常规ASCII范围之外的字符会像这样失败?当我将分隔符更改为(十进制)28(^\)时,一切正常.我只是不想在不同的平台上遇到类似的问题.(我目前正在使用Redhat Linux).