2017-10-22 9 views
2

Tcl_WriteChars 출력 UTF-8 문자를 올바르게 작성하는 데 필요한 초기 설정이 있습니까? 예 :Tcl_WriteChars가 유니 코드를 지원하는 방법?

#include <tcl.h> 

int main() 
{ 
     Tcl_Interp *tcl = Tcl_CreateInterp(); 

     Tcl_Channel channel = Tcl_GetStdChannel(TCL_STDOUT); 

     Tcl_WriteChars(channel, "hello\n", -1); 
     Tcl_WriteChars(channel, "你好\n", -1); 
     Tcl_WriteRaw(channel, "你好\n", -1); 

     Tcl_Close(tcl, channel); 

     Tcl_DeleteInterp(tcl); 

     return 0; 
} 

소스 코드는 UTF-8 인코딩으로 저장되며, 다음과 같은 출력이 UTF-8 로케일 리눅스에서입니다 :

hello 
?? 
你好 

답변

3

당신은 UTF-8 (호스트로 인코딩을 구성해야 실행중인 사용자는 기본값으로 다른 것을 사용하고있는 것처럼 보입니다.) 채널에 쓰기 전에이 작업을 수행하십시오.

Tcl_SetChannelOption(interp, channel, "-encoding", "utf-8"); 

제대로, 당신은의 반환 코드를 확인해야합니다 (아래)하지만, 모든 채널은 옵션과 utf-8 인코딩은 Tcl에 직접 구워진다, 그래서 그것은 실패하지 않습니다.

이 가
가 이

[편집]을

if (Tcl_SetChannelOption(interp, channel, "-encoding", "utf-8") != TCL_OK) { 
    return TCL_ERROR; 
} 
: 조금 더주의 깊게 코드를 다시 읽기 (시스템의 기본 인코딩이 처음에 정말 UTF-8임을 발견), 갖는 실제 문제가 너는 Tcl_FindExecutable()이 아니라고. 그 루틴은 약간 틀린 이름으로, 실제로 무엇을하는지 (스크립트 내에서 info nameofexecutable 작업을 만드는 것과 별개로) Tcl이 내부 라이브러리를 초기화하도록합니다. 특히, 인코딩 관리 서브 시스템을 초기화하고 이것이 시스템 인코딩이 실제로 무엇인지 알아내는 지점입니다 (그렇지 않으면 복구 할 수있는 가장 문제가없는 일반 인코딩 인 iso8859-1으로 되돌아갑니다).

코드는 읽어야 : 당신이 문 다음 선언을 퍼팅에 만족 컴파일러를 사용하고

#include <tcl.h> 

int main(int argc, char *argv[]) /// <<<< CHANGED HERE 
{ 
    Tcl_FindExecutable(argv[0]); /// <<<< CHANGED HERE 

    Tcl_Interp *tcl = Tcl_CreateInterp(); 

    Tcl_Channel channel = Tcl_GetStdChannel(TCL_STDOUT); 

    Tcl_WriteChars(channel, "hello\n", -1); 
    Tcl_WriteChars(channel, "你好\n", -1); 
    Tcl_WriteRaw(channel, "你好\n", -1); 

    Tcl_Close(tcl, channel); 

    Tcl_DeleteInterp(tcl); 

    return 0; 
} 

내가 있으리라 믿고있어. 이것은 광범위하게 구현 된 C99 기능이며 C++에서도 제공되므로 잘 될 것으로 기대합니다.

+0

감사! 그것은 작동합니다. 내 호스트에서'iso8859-1'을 반환하는'Tcl_GetChannelOption'을 검사했습니다. 호스트 로케일을 UTF-8로 설정 했으므로 정말 이상합니다. –

+0

오! 방금 문제가 무엇인지 깨달았습니다. 당신은 결코'Tcl_FindExecutable'을 호출하지 않습니다; 그게 중요한 것은 시스템 인코딩이 실제로 무엇인지 알아내는 것입니다. –

+0

또한'tclsh'는'Tcl_MainEx'에서'Tcl_FindExecutable'에 의존하는'TclpSetInitialEncodings'를 호출 할 것이기 때문에'tclsh'에는이 문제가 없다고 나타났습니다. BTW, 나는'TclInitEncodingSubsystem'에서 왜'TclpSetInitialEncodings'이 호출되지 않는지 궁금합니다. 어느 것이 더 적합한 곳인 것 같습니다. 이 함수는'TclInitSubsystems'에 의해 호출됩니다.이 함수는'Tcl_FindExecutable'과'Tcl_CreateInterp'에 의해 호출됩니다. 다른 시스템에 Tcl을 내장하고 있으므로'argv0'는 확장 시스템에 노출되지 않으므로'Tcl_FindExecutable'을 호출 할 수 없습니다. –