[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Debian for ARM710的中文化問題



ha shao wrote:

> On Wed, Jan 24, 2001 at 10:27:04PM +0800, shuyong@public.nn.gx.cn wrote:
> > 關于ARM710的中文化的問題:
> >     上回提出了debian for arm710 X Window的問題,到現在都沒有人指點,說老實話,
> > 有些失望。因為在我心裡,debian似乎是無所不能的。現在問題雖然沒有解決,但也有一些
> >
> > 進展,希望大家幫忙解決。
>
> 我想這裡使用 Arm 的沒有幾個(可能目前就你一個),如果沒有機器,
> 自然什麼也幫不上什麼忙了。你所說的問題,應該是 XFree86 的臭蟲,
> 應該是在 xfree86 的郵件列表中討論的。
>

其實不要把其它CPU的程序想象得那麼神秘。*nix和C的可移植性是很強的。
有時問題也是通用的。我所希望的不是具體指導如何對arm編程,而是各位
在中文化方面的經驗。有時是一句點醒夢中人。何況debian可以在這麼多的
平台上運行,而我們卻不能使中文到處都有,是不是一種遺憾?

>
> 我知道英語是一個問題,但希望你還是試著用英語在相關的列表進行
> 討論。因為作為一個想進行開發的‘hack’,特別是在自由軟件的世界,
> 是必須要經過使用英語這個痛苦的。事實上這個世界上不僅僅是中國
> 人不講英語,很多國家的人都不是使用英語的,所以你在英語的郵件
> 列表中經常看到不通的英語,但沒有人會在意的。大家的目的是解決
> 問題,是用程序交談的。開始很別扭,但我保証很快你就會覺著沒有
> 什麼了。到底英語不是我們的母語,說的不好沒有什麼,解釋不清就
> 再解釋一遍,最後能懂就行。

我的英文確實差,不是惡補一兩天所能解決的。不過我會努力的。

>
>
> > 原本XDrawString16不能畫漢字的問題,現在已經知道原因。原來是沒有設置前景色。
> > 在X Window的編程例子曾經提到這個事情,X
> > Window初始只有背景色而沒有前景色。但是
> > X86平台是兩者是設置好的。看來跨平台是不能想當然的。
> >
>
> XFree86 開始是移植到 intel x86 系統上的,然後再向其他的系統上
> 移植,所以對各個系統的支持程度不是相同的,也不可能完全相同。
> 這應該是移植到 ARM 上時的一個臭蟲(沒有預設前景顏色?),
> 最好回報給 Xfree86.
>

這倒不是xfree86的bug,而是X Window的傳統。每個window初始都沒有前景色,然後程序
親自設置。這也是X程序的慣例。

>
> > 但是問題沒有解決。XDrawString16在第一次畫漢字時會在字符串前面加上一個莫名其妙
> > 的字,同時最後一個漢字沒有畫出來(如果把字符串的長度加1也可以顯示最後一個漢字)。
>
> > 如果能刷新窗口就正常了。還有XmbString/XwcString不能正常顯示漢字串。這個問題比較
> > 麻煩。原因是結構對齊的問題。因為arm710要求2字節(word)對齊,所以gcc
> > for arm幹脆
> > 就是4字節(dword)對齊。結果sizeof(XChar2b)==4,而不是==2,整個漢字串自然短斤少兩
> > 了:-)。不知道gcc有什麼選項指令編譯按照2字節(word)對齊的?也請大家把我的問題提交到
>
> > debian-X的討論組上。
>
> sizeof(XChar2b) == 4會影響嗎?這些都應該在 xfree86 的 ARM port 上
> 解決,debian-x 主要討論的是在 debian 上對 X 系統的包裝,安裝。
>

因為一個假設,sizeof(XChar2b) == 4會有影響。
一般顯示漢字是這樣:
char *chinese = "這是中文字符串";
char *ch_str;
XFontStruct *font = XLoadQueryFont (display,
"-isas-*-medium-r-normal--16-160-72-72-c-160-gb2312.1980-0");

 XSetFont (display, gc, font->fid);
 length = strlen (chinese);
 ch_str = strdup (chinese);
 for (i = 0; i < length; i++) {
  ch_str[i] &= 0x7F;
 }
 length /= 2;
 XDrawString16 (display, window, gc, x, y, (_Xconst XChar2b *)ch_str, length + 1);

注意ch_str的使用,這是不規范和不可移植的。主要是little/big endian的問題。XChar2b是
這樣定義:

typedef struct {
 unsigned char byte1;
 unsigned char byte2;
} XChar2b;
或:
typedef struct {
 unsigned char byte2;
 unsigned char byte1;
} XChar2b;

這是由little/big endian的特性來決定。不管怎樣,sizeof (XChar2b) == 2。上述代碼
應該是:(這也是X內部代碼使用的技巧)

char *chinese = "這是中文字符串";
XChar2b *ch_str;
XFontStruct *font = XLoadQueryFont (display,
"-isas-*-medium-r-normal--16-160-72-72-c-160-gb2312.1980-0");

 length = strlen (chinese);
 ch_str = (XChar2b *)malloc (length + sizeof (XChar2b));
 memset (ch_str, 0, length + sizeof (XChar2b));
 for (i = 0; i < length / sizeof (XChar2b); i++) {
  ch_str[i].byte1 = chinese[i * 2] & 0x7F;
  ch_str[i].byte2 = chinese[i * 2 + 1] & 0x7F;
 }
 length /= sizeof (XChar2b);
 XDrawString16 (display, window, gc, x, y, (_Xconst XChar2b *)ch_str, length + 1);

可能是因為效率問題,XDrawString16假設每個字是緊密排列進行顯示的。你可以想象
當sizeof(XChar2b) == 4時的情況。所以我要尋找gcc關于結構對齊的選項。看看我的想法
是否正確。

-- 
| This message was re-posted from debian-chinese-gb@lists.debian.org
| and converted from gb2312 to big5 by an automatic gateway.



Reply to: