早上花了一些時間, 看了一下 patch 過的地方, 意外的發現.... 似乎不需要 patch, 在 rrd_gfx.c 裡頭, 本身就有就 patch 的那一段程式碼, 看起來功能都一樣. 應該 1.2.1x 的程式, 本來就應該可以正確顯示中文字才對. 而且, 就算在 1.2.15 中特別加上那一段 patch 來處理, 結果仍然一樣, 可見, 不能顯示中文, 應該與 rrd_gfx.c 這兒無關.
比較了另一個有 patch 到的程式 rrd_graph.c, 發現在 1.2.15 與我之前用的 1.2.11 版之間, 有一個小差別, 就是新的程式會在設定 locale 之後, 把 LC_CTYPE 設成空的. 我把這個地方移除, 然後把 LC_ALL 設定 en_US.UTF-8 之後, 果然中文字就可以正常顯示了.
--- rrdtool-1.2.15.orig/src/rrd_graph.c 2006-07-14 20:11:26.000000000 +0800
+++ rrdtool-1.2.15/src/rrd_graph.c 2006-12-15 12:05:58.284430573 +0800
@@ -3062,9 +3062,10 @@
tzset();
#endif
#ifdef HAVE_SETLOCALE
- setlocale(LC_TIME,"");
+ //setlocale(LC_TIME,"");
+ setlocale(LC_ALL,"en_US.UTF-8");
#ifdef HAVE_MBSTOWCS
- setlocale(LC_CTYPE,"");
+ //setlocale(LC_CTYPE,"");
#endif
#endif
im->yorigin=0;
上頭的 patch, 可以由這兒抓取: http://www.teatime.com.tw/~tommy/mypatch/rrdtool-1.2.15.patch
經過這樣子處理之後, 就可以讓 RRDTool 正確的畫出中文字了.
請教一下,我在我的 linux 中的 locale 設定如下:
# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
那程式中setlocale(LC_CTYPE,""); 是不是表示又把設定改為空了?
那如果我已經用 rpm 裝了,可否很簡單的從 patch 過的得到一個執行檔,覆蓋過原本的就可以了呢?
冒昧請教,多多包含...
對, 程式裡頭呼叫 setlocale 會覆蓋你在外頭的設定. 通常是在程式內不去呼叫 setlocale 才會使用你目前的執行環境.
是可以自己弄一個執行檔來蓋過去. 不過既然都要 build, 直接弄一個 rpm 來裝不是比較簡單?
Hi...謝謝你的解答
我裝的版本就是 dag 包好的 rpm,可是是沒有修過 patch 的 rpm
我剛剛已經用 tarball 重新裝一份了,因為 rpm 的程式放在 /usr/bin 底下,而 tarball build 的預設我把他定在 /usr/local/rrdtool 底下,這樣應該不會有衝突吧 :P
對了,請問一下你的圖形中用的字型是?我目前用的是微軟正黑體,但是好像跟你的還是有差,我的在字數筆劃多一點的時候,還是會黑黑一團,可否請教您的字型呢?
我是用正黑體. (title 用粗體)