Когда ¦ не равно ¦? - PullRequest
1 голос
/ 05 мая 2010

Фон. Я работаю с netlists , и, как правило, люди задают различные иерархии с помощью /. Однако на самом деле не является незаконным использование / в качестве части имени экземпляра.

Например, 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 ¦] /]

В общем, замените ¦ на / (я мог бы также сделать это с [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 ]

6 голосов
/ 05 мая 2010

Latin-1 имеет два разных вертикальных символа символов:

  • 124 | ВЕРТИКАЛЬНАЯ ЛИНИЯ
  • 166 RO BROKEN BAR

Некоторые старые шрифты перепутали два символа.

4 голосов
/ 05 мая 2010

Насколько я понимаю, современные версии TCL используют UTF-8 для представления строк. В UTF-8 десятичное число 166 - это половина символа, поэтому неудивительно, что весь ад разваливается. ; -)

Я предполагаю, что ваш код на C ++ использует строку Latin-1 (т.е. char *), и вы передаете ее в TCL, который интерпретирует ее как строку UTF-8. Вам нужно преобразовать вашу строку C ++ в UTF-8, прежде чем передавать ее в любые функции TCL C. TCL предоставляет некоторые функции для этой цели .

Вы можете узнать больше о TCL и UTF-8 .

4 голосов
/ 05 мая 2010

В моей системе tcl-скрипт puts [format %c 166] выводит в UTF-8 ("\ xC2 \ xA6"), а оператор C ++ cout << "\xA6"; выводит Latin-1. Убедитесь, что различия в кодировке не сбивают вас с толку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...