什么时候|不等于|?

Tre*_*son 1 c c++ ascii tcl

背景.我正在使用网表,一般来说,人们通过使用指定不同的层次结构/.但是,实际使用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).

dan*_*n04 6

Latin-1有两个不同的竖线字符:

  • 124 | 垂线
  • 166 | BROKEN BAR

一些较旧的字体混合了两个字形.