2016-10-19 3 views
2

X Window 프로그램에 ISO-10646 고정 글꼴을 사용하려고합니다. 영어, 러시아어 및 그리스어 편지를 지원해야하지만 그렇지 않습니다. xfontsel 창에서는 모두 정상이지만 내 프로그램에서는 영어 만 올바르게 표시됩니다. g++ -fexec-charset=ISO-10646 ... 또는 g++ -finput-charset=ISO-10646 ...과 같은 것을 사용하는 것은 도움이되지 않았습니다. 어떻게 해결할 수 있습니까?ISO-10646 X 글꼴 인코딩 문제


테스트 응용 프로그램 창 스크린 샷 :

Test app window screenshot


xfontsel 창 스크린 샷 :

xfontsel window screenshot


테스트 응용 프로그램 코드 :

#include <X11/StringDefs.h> 
#include <X11/Xaw/Command.h> 

int main(int argc, char **argv) { 
    Widget widget = XtInitialize(argv[0], "simple", NULL, 0, &argc, argv); 
    XtVaCreateManagedWidget(
     "English Русский ελληνικά", labelWidgetClass, widget, 
     XtNfont, XLoadQueryFont(XtDisplay(widget), 
      "-Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO10646-1" 
     ), XtNwidth, 500, XtNheight, 100, NULL 
    ); 
    XtRealizeWidget(widget); 
    XtMainLoop(); 
} 

답변

1

이 프로그램은 Xt/Xaw에서 기대하지 않는 UTF-8 인코딩 단일 바이트 문자열을 사용합니다. -fexec-charset은 도움이되지 않습니다.

순수한 Xlib (툴킷 없음)을 사용하면 Xutf8DrawString과 친구들을 사용할 수 있지만 Xt와 Xaw는 이에 대한 조항이 없습니다.

Xaw은 이론적으로 XtNencodingXawTextEncodingChar2b으로 설정 한 레이블의 2 바이트 인코딩을 지원하지만 UTF-16에서는 작동하지 않을 수 있습니다.

XChar2b lbl[] = { {0x04, 0x40}, {0x04, 0x43}, 
         {0x04, 0x41}, {0x04, 0x41}, 
         {0x04, 0x3a}, {0x04, 0x38}, 
         {0x04, 0x39}, {0, 0}}; 

    XtVaCreateManagedWidget(
    "w00t", labelWidgetClass, widget, 
    XtNfont, XLoadQueryFont(XtDisplay(widget), 
     "-Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO10646-1" 
    ), XtNwidth, 500, XtNheight, 100, 
    XtNencoding, XawTextEncodingChar2b, 
    XtNlabel, lbl, 
    NULL 
); 

이 특정 문자열이 작동합니다. 임의의 라벨을 만드는 법을 알기를 바랍니다. 그러나 높은 위치 또는 낮은 위치의 널 바이트는 문자열을 종료하므로이 방법으로 영문 텍스트를 표시 할 수 없습니다.

아마도 내 컴퓨터의 Xaw 복사본이 최신 버전이 아닙니다. here을 작동시켜야하는 패치가 있지만,이 복사본에이 패치가 적용되어 있는지, 소스에서 패치 된 버전을 빌드 할 수 없는지는 잘 모르겠습니다. 아마도 모든 머신에 최신 Xaw 라이브러리가있는 것은 아니므로 동적으로 링크 된 코드를 배포하려는 경우에는 사용하지 않는 것이 좋습니다. 이 패치는 2014 년에 만들어졌습니다.

제 조언은 Xaw의 i18n 능력에 의존하지 않아야합니다. Xutf8DrawString과 함께 원시 X11을 사용하거나 Qt, Gtk 또는 FLTK 또는 wxWidgets와 같은 최신 툴킷을 사용하십시오. 모든 UTF-8을 원활하게 사용할 수 있습니다. 최후의 수단으로, 필요에 따라 Xaw 위젯을 하위 클래스 화하고 Xutf8DrawString과 함께 작동하게하십시오.

업데이트 나는 최신이되어야하는 Gentoo ebuild에서 소스를 확인했습니다. 패치가 적용되지 않았으므로 어디서나 strlen이 있으며 XChar2b이 작동하지 않습니다. 일반적인 Xaw 코드 조각 :

len = strlen(label); 
... 
if (len) { 
    if (w->label.encoding) 
     XDrawString16(XtDisplay(gw), XtWindow(gw), gc, 
       w->label.label_x, y, (XChar2b *)label, len/2); 
    else 
     XDrawString(XtDisplay(gw), XtWindow(gw), gc, 
       w->label.label_x, y, label, len); 
} 

분명히 올바르게 작동 할 수는 없습니다.