在 Cacti 中顯示中文
.K.T. | 2008 年 05 月 17 日 | 下午 3:49今天
我終於把困擾了我好久的
Cacti 中文化問題解決了
這邊說的中文化
不是指將整個系統變成繁體中文(這太難了……)
而是
讓 Cacti 可以正常的顯示中文
不會出現亂碼
我參考了 Tommy 的這篇文章
首先
必須將 MySQL 的預設編碼改成 UTF-8
透過修改 MySQL的設定檔
vi /etc/my.cnf
在 [mysqld] 內
加上
default-collation=utf8_general_ci
接著重新啟動 MySQL
service mysqld restart
完成 MySQL 的設定
接下來
將 Cacti 產生的 html 網頁
加上 UTF-8 的設定
我先修改 include/top_header.php
找到 <title> 的地方(可利用 vi 的功能 "/" 去找!)
在 <title> 之前加上
接著修改 lib/graph_export.php
一樣找到 <title> 的地方
在 <title> 之前加上
這裡要注意一下
graph_export.php 這個檔案中
有兩個地方有 <title>
記得都有加上去喔
再來
修改 lib/database.php
在連上資料庫後加上
我是將原本的
return(1);
}
改成
$cnn_id->Execute("set names 'utf8'");
return(1);
}
之前我只做到這裡
大部份的中文化都已經完成
但是
Data Source 這一頁還是有亂碼產生
今天
終於被我發現是哪裡出了問題
在 data_sources.php 這個檔案中
有用到 htmlentities() 函式(註:1)
就是這個函式造成中文顯示成亂碼
我將這個函式改成 htmlspecialchars()(註:2)
修改 data_sources.php 這個檔案
找到兩個
將它們都改成
這樣就完成了
終於可以看到顯示中文的 Cacti
真開心啊!
註:







$cnn_id->Execute("set names 'utf8'");
我是將原本的
if ($cnn_id->PConnect($hostport,$user,$pass,$db_name)) {
return(1);
}
改成
if ($cnn_id->PConnect($hostport,$user,$pass,$db_name)) {
$cnn_id->Execute("set names 'utf8'");
return(1);
}
这一添加会出现问题
xuhj 您好!
我看了一下我的設定
這樣應該是沒有問題才對
加上
$cnn_id->Execute("set names 'utf8'");這一句是為在連線到資料庫後
將所使用的編碼改成 UTF-8
不過
前提是你的資料庫支援 UTF-8
你可以到 MySQL 中
下
set names 'utf8'如果資料庫有支援 UTF-8
執行結果應該像下面這樣
mysql> set names 'utf8';Query OK, 0 rows affected (0.00 sec)
你再試試看吧
如果有其他問題
歡迎一起討論喔!
這個做法在 CactiEZ v0.4 (0.8.7b) 上打中文實做後會出現?…所以不知有人在這個版本成功嗎 ? 或是我漏掉了什麼 … 都已經檢查 2次,好羨慕做出來的人…唉~
JTY 您好!
雖然我用的不是 CactiEZ
不過
我的 Cacti 版本也是 v0.8.7b
我想同樣的做法應該也可以才對
你說打中文會出現「?」
有可能是你的 MySQL 資料庫編碼不是 UTF-8
我記得
MySQL 預設的編碼是 latin1
你可以去 MySQL 裡面看看 Cacti 所用的資料表編碼是否為 UTF-8
如果不是
改成 utf8_general_ci 或 utf8_unicode_ci 應該都可以
你可以看一下
如果在 MySQL 中可以正確顯示中文
就差不多成功了
希望你也可以實做成功!
.K.T.您好
我已用您的方法…在CactiEZ 中,成功修改 threshold 的資料並顯示出中文,但就如 xuhj 所說,在 CactiEZ 版本中,若照您最後一個步驟實做後,又會出現亂碼(但我也不知原因及如何修改)。而您說的也沒錯 Cacti 資料庫,因預設為 latin1,所以將部份欄位得修改成utf8_unicode_ci 就解決了另一個問題。
無論如何…我非常感恩,終於"又"有進展了。只可惜show 出的圖還是只能顯示英文,但我已非常的高興了。
JTY 您好!
如果說
你在 MySQL 中可以看到中文的資料
那 $cnn_id->Execute("set names 'utf8'"); 這一行可以不用加
因為加上這一行的用意是為了在連線到資料庫時
將所使用的編碼改成 UTF-8
既然在 MySQL 中都正確地寫入中文資料了
那就不用刻意地將編碼改成 UTF-8 了
另外
我最後一個步驟將 htmlentities() 修改成 htmlspecialchars()
這兩個函式的用途我在備註有寫到
不知道你遇到的問題是什麼
是我說錯了~最後一個步驟得將 htmlentities() 修改成 htmlspecialchars() 是要依您的步驟執行。sorry …一時手誤 !
而是執行
if ($cnn_id->PConnect($hostport,$user,$pass,$db_name)) {
$cnn_id->Execute("set names 'utf8'");<才會讓 threshold 資料有亂碼產生
近期也在測試及尋找圖形中 |host_description| 位址不會出現亂碼的方法,但這次已不是 ?? 的符號,而是一堆亂碼,希望您可能指點迷津…這會 " 我及對cacti的使用者" 興奮不已。
我想
應該是你之前建 threshold 資料的時候
用的編碼不是 UTF-8
所以存在資料庫中的資料不是以 UTF-8 編碼
一旦將連線所用的編碼改掉
因為改用 UTF-8 去讀這些資料
就會出現亂碼
我猜
你將 $cnn_id->Execute("set names 'utf8'"); 加上去之後
再重新修改一次 threshold 資料(或加上新的資料)試試
如果跟我想的一樣
改完之後應該就成功了!
請問一下.Cacti畫出來的圖中文字無法正常顯示.請問該怎麼解決?
資料庫和網頁都已經是UTF-8了
請先進指教,謝謝!
我架 Cacti Server 已經過滿久了
有點忘記當初是怎麼做的了
我猜
你在 Cacti 上新增 Devices 的時候
你將 Devices 的 Description 這一欄填入中文
因為你說你的資料庫和網頁都已經是 UTF-8 了
所以我想你的 Devices 清單應該可以正確顯示中文了
如果說
Devices 清單中文顯示正常
但是 Cacti 所畫出的圖卻無法正確顯示中文
我猜想
應該是 RRDTool 在產生圖片時
無法正確顯示中文
你可以先到 Graph Management 裡
隨意選一個標題是中文的圖
然後點選右上角的 Turn On Graph Debug Mode
看一下 RRDTool 在產生圖片時的 Command
是不是正確地帶出中文標題
它可能類似
/usr/bin/rrdtool graph - \--imgformat=PNG \
--start=-86400 \
--end=-60 \
--title="伺服器 - 網路流量" \
......
如果 title 所帶出來的是亂碼
那可能網頁或資料庫裡的資料也還是亂碼
就要再看看網頁或資料庫的設定
如果 title 所帶出來的是正確的中文
那應該就是 RRDTool 設定的問題
你可能要看看你 RRDTool 所設定的字型
是不是支援中文
或是用來架 Cacti 的 Server
本身支不支援中文
以上這些希望可以幫到你
若有問題
我們再來討論討論吧!
昨天將公司裡的 Cacti Server 更新到 Version 0.8.7g
發現 Cacti 所畫的圖中
也有部分資料沒辦法顯示中文
花了不少時間終於查出
是
lib/functions.php中的函數cacti_escapeshellarg過濾字串時所造成所有非 ASCII 的文字均無法正常顯示
解決方法為.........
加上
setlocale(LC_CTYPE, "zh_TW.UTF-8");之後中文就可以正常顯示了!