代码之家  ›  专栏  ›  技术社区  ›  Trey Jackson

什么时候不等于?

  •  1
  • Trey Jackson  · 技术社区  · 14 年前

    背景。我正在和 netlists 通常,人们通过使用 / . 但是,实际使用 / 作为实例名称的一部分。

    例如, X1/X2/X3/X4 可能引用实例 X4 在另一个名为 X1/X2/X3 . 或者它可能引用一个名为 X3/X4 在名为 X2 在名为 X1 . 知道了?

    真的没有“常规”的角色 不能 作为实例名的一部分使用,所以您可以使用不可打印的实例名,或者…可能是标准0..127之外的一个 ASCII 字符。

    我想我会尝试(十进制)166,因为对我来说它显示为管道: ¦ .

    所以…我有一些C++代码,用来构建路径名 γ 作为层次分隔符,因此上面的路径看起来像 X1¦X2/X3¦X4 .

    现在,图形用户界面是用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)。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Daniel Stutzbach Edward Leno    14 年前

    据我所知,TCL的现代版本在内部使用UTF-8来表示字符串。在utf-8中,decimal 166是半个字符,所以难怪所有的地狱都在破灭。;-)

    我的猜测是,C++代码使用的是LaTun-1字符串(即, char * )然后将其传递给tcl,tcl将其解释为一个utf-8字符串。您需要将C++字符串转换为UTF-8,然后将其传递给任何TCL C函数。TCL提供 some functions for this purpose .

    你可以阅读更多关于 TCL and UTF-8 .

        2
  •  6
  •   dan04    14 年前

    拉丁语-1有两种不同 vertical bar 字符:

    • 124垂直线
    • 166Ω断杆

    一些旧字体混淆了这两个字形。

        3
  •  4
  •   outis    14 年前

    在我的系统上,tcl脚本 puts [format %c 166] UTF-8(“\xC2\xA6”)中的输出,而C++语句 cout << "\xA6"; 输出拉丁语-1。确保编码差异不会让您失望。