Hi,All
I am porting Tiny-X to XScale platform,
When I want to display chinese, I meet some problem.
The following is my porting procedure.
I compile locale data using localedef(arm), put the locale data to
/usr/lib/locale/zh_CN
I put gconv.modules ,EUC-CN.so , libGB.so to /usr/lib/gconv
I edit locale.dir and locale.alias , add zh_CN.GB2312 support to these files
I put chinese font to /usr/X11R6/lib/X11/fonts/misc, and edit fonts.dir , fonts.alias
I export LC_ALL variable to zh_CN.GB2312 ,
Library I use is:
glibc-2.2.3.so
XFree86-4.20
BUT it can not display chinese,
following is my test program
setlocale(LC_ALL,"") is OK
XSupportsLocale() is OK
XSetLocaleModifiers(NULL) is OK
num = mbstowcs(wcstr,string,strlen(string)) is OK
XCreateFontSet(...) is OK
XmbDrawString(display,win,fontset,gc,50,100,string,strlen(string)); //display error
text(english is right, chinese is wrong)
XwcDrawString(display,win,fontset,gc,50,140,(wchar_t *)wcstr,num); //display error
text(english is right, chinese is wrong)
I wonder if XServer is wrong. Does Xserver need to set some options about locale when
It is compiled.
I wonder if xfs must run .
I am not sure whether It is locale problem or font problem.
Please help me to analyse this problem , What problem I could meet?
Thank you very much.
following is my test program
/* File: i18n-output.c */
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <stdio.h>
#include <locale.h>
int main(int argc, char **argv)
{
char *string = "这是中文和English的混和字符串!"; //chinese & english compound string
Display *display;
int screen_num;
Window win;
unsigned int width, height;
unsigned int border_width= 4;
unsigned int display_width, display_height;
int count;
XEvent report;
GC gc;
unsigned long valuemask = 0;
XGCValues values;
char *display_name = NULL;
//
XFontSet fontset; char **missing_charsets;
int num_missing_charsets;
char *default_string;
wchar_t wcstr[80];
//
int num;
//
if((setlocale(LC_ALL, "")) == NULL)
{
printf("cannot set locale\n");
return 1;
exit(1);
}
//
if(!XSupportsLocale())
{
printf("X does not support current locale\n");
exit(1);
} //设置locale修饰
if(XSetLocaleModifiers(NULL))
{
printf("Cannot set locale modifiers\n");
exit(1);
}
//
if ((display=XOpenDisplay(display_name)) == NULL )
{
printf("Cannot connect to X server %s\n", XDisplayName(display_name));
exit(-1);
}
//
screen_num = DefaultScreen(display);
//
display_width = DisplayWidth(display, screen_num);
display_height = DisplayHeight(display, screen_num);
//
width = display_width/3;
height = display_height/4;
//
win = XCreateSimpleWindow(display, //display
RootWindow(display,screen_num),//父窗口
0, 0, width, height, //位置和大小
border_width, //边界宽度
BlackPixel(display,screen_num), //前景色
WhitePixel(display,screen_num));//背景色
//选择窗口感兴趣的事件掩码
XSelectInput(display, win, ExposureMask | KeyPressMask | ButtonPressMask |
StructureNotifyMask);
//建立GC
gc = XCreateGC(display, win, valuemask,&values);
//建立字体集
fontset = XCreateFontSet(display,
//"8x16,-misc-SimSun-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0"
"8x16,-isas-fangsong ti-medium-r-normal--0-0-72-72-c-0-gb2312.1980-0",
//"8x16,-*-song-medium-r-normal--16-*-*-*-*-*-gb2312.1980-0",
&missing_charsets, &num_missing_charsets,
&default_string);
if(num_missing_charsets > 0)
{
int i;
printf("Following charsets are missing:\n");
for(i=0; i<num_missing_charsets; i++)
{
printf("Missing %d: %s\n",i,missing_charsets[i]);
}
printf("\ndefault string:%s\n",default_string);
//XFreeSringList(missing_charsets);
}
num = mbstowcs(wcstr,string,strlen(string));
XMapWindow(display,win);
while(1)
{
XNextEvent(display,&report);
switch (report.type)
{
case Expose:
if(report.xexpose.count != 0)
break;
XmbDrawString(display,win,fontset,gc,50,100,string,strlen(string));
XwcDrawString(display,win,fontset,gc,50,140,(wchar_t *)wcstr,num);
break;
case ButtonPress:
case KeyPress:
XFreeFontSet(display,fontset);
XFreeGC(display,gc);
exit(1);
default:
break;
}
}
}
licz
_______________________________________________
I18n mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/i18n