2010-05-05 3 views
1

배경. 저는 netlists으로 일하고 있으며 사람들은 일반적으로 /을 사용하여 다른 계층 구조를 지정합니다. 그러나 실제로 인스턴스 이름의 일부로 /을 사용하는 것은 불법이 아닙니다.|이 |와 같지 않은 경우?

예를 들어, X1/X2/X3/X4X1/X2/X3이라는 또 다른 인스턴스 안에 인스턴스 X4을 참조 할 수 있습니다. 또는 X1이라는 인스턴스 안에 X2이라는 인스턴스 안에 X3/X4이라는 인스턴스를 참조 할 수 있습니다. 알았다?

표준 0..127 ASCII 아마도 하나 개 밖에 ...이 는 인스턴스 이름의 일부로 사용할 수 없습니다 수 정말 더 "일반"문자는 없다, 그래서 당신은 비 인쇄 하나에 의지하거나, chars.

내가 파이프 (¦)로 표시되기 때문에 나는 (십진법) 166을 시도 할 것이라고 생각했다.

그래서 ... ¦을 계층 구분 기호로 사용하여 경로 이름을 구성하는 코드가 있으므로 위 경로는 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 범위를 벗어나는 문자가 t 그의? 구분 기호를 (십진수) 28 (^\)로 바꿨을 때 문제가 없었습니다. 나는 다른 플랫폼에서 비슷한 문제를 일으키고 싶지 않습니다. (현재 Redhat Linux를 사용하고 있습니다).

답변

4

제가 알고 있듯이 TCL의 최신 버전은 문자열 표현을 위해 내부적으로 UTF-8을 사용합니다. UTF-8에서는 십진수 166이 문자의 절반이므로 모든 지옥이 느슨해 진 것은 당연합니다. ;-)

제 생각에는 C++ 코드가 Latin-1 문자열 (즉, char *)을 사용하고 있으며 이것을 UTF-8 문자열로 해석하는 TCL로 전달한 것 같습니다. TCL C 함수에 전달하기 전에 C++ 문자열을 UTF-8로 변환해야합니다. TCL은 some functions for this purpose을 제공합니다.

TCL and UTF-8에 대한 자세한 내용을 볼 수 있습니다.

+2

NB : 현대는 "8.1 이후"를 의미하며 10 년이 넘도록 지속되었습니다. 또한, 질문자가 찾고있는 함수는'Tcl_ExternalToUtfDString'입니다. –

6

라틴어-1은 두 개의 서로 다른 vertical bar 문자가 있습니다

  • 124 | VERTICAL LINE
  • 166 | BROKEN BAR는

일부 구형 글꼴은 두 개의 상형 문자를 혼합.

+0

맞아, 문제는''[scan % c $ string]'이 ** 내 Tcl 및 C++ 생성 문자 모두 **에 대해 166을 반환한다는 것입니다. 앞에서 설명한대로 문제가 발생했다면'[scan % c |] '는 (166이 아닌) 124를 반환합니다. –

+0

@ dan04 : 입력 만 할 수 있습니다. 내 키보드에서 [수직선]. 어떻게 깨진 막대를 타이핑 했습니까? – Lazer

+0

문자표를 사용했습니다. – dan04

4

내 시스템에서 tcl 스크립트 puts [format %c 166]은 UTF-8 ("\ xC2 \ xA6")으로 출력하고 C++ 문 cout << "\xA6";은 Latin-1을 출력합니다. 인코딩의 차이가 당신을 버리지 않았는지 확인하십시오.

관련 문제