.K.T.'s Blog

一個屬於 .K.T. 的小小地方......
  • 首頁
  • Archives
  • GuestBook
  • About

在 Cacti 中顯示中文

.K.T. | 2008 年 05 月 17 日 | 下午 3:49

今天
我終於把困擾了我好久的
Cacti 中文化問題解決了

這邊說的中文化
不是指將整個系統變成繁體中文(這太難了……)
而是
讓 Cacti 可以正常的顯示中文
不會出現亂碼

我參考了 Tommy 的這篇文章
首先
必須將 MySQL 的預設編碼改成 UTF-8
透過修改 MySQL的設定檔

vi /etc/my.cnf

在 [mysqld] 內
加上

default-character-set=utf8
default-collation=utf8_general_ci

接著重新啟動 MySQL

service mysqld restart

完成 MySQL 的設定

接下來
將 Cacti 產生的 html 網頁
加上 UTF-8 的設定
我先修改 include/top_header.php
找到 <title> 的地方(可利用 vi 的功能 "/" 去找!)
在 <title> 之前加上

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

接著修改 lib/graph_export.php
一樣找到 <title> 的地方
在 <title> 之前加上

<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">

這裡要注意一下
graph_export.php 這個檔案中
有兩個地方有 <title>
記得都有加上去喔
再來
修改 lib/database.php
在連上資料庫後加上

$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);
}

之前我只做到這裡
大部份的中文化都已經完成
但是
Data Source 這一頁還是有亂碼產生
今天
終於被我發現是哪裡出了問題

在 data_sources.php 這個檔案中
有用到 htmlentities() 函式(註:1)
就是這個函式造成中文顯示成亂碼
我將這個函式改成 htmlspecialchars()(註:2)
修改 data_sources.php 這個檔案
找到兩個

htmlentities($data_source["name_cache"])

將它們都改成

htmlspecialchars($data_source["name_cache"])

這樣就完成了

終於可以看到顯示中文的 Cacti
真開心啊!


註:
  1. htmlentities():這是一個 PHP 的函式,將所有 String 的字元都轉成 HTML 的特殊字集字串,所以才造成中文顯示成亂碼。 [↩]
  2. htmlspecialchars():這也是一個 PHP 的函式,跟 htmlentities() 不同的地方在於,這個函式只轉換一些特殊字元,而不全部轉換成 HTML 所定的 ASCII 轉換,所以中文就不會被改成亂碼了。 [↩]
分類彙整
工作雜記, 資訊相關
Tags
Cacti
RSS 迴響
RSS 迴響
引用
引用

« DS 版的吉他英雄 更新主機 »

11 Responses to “在 Cacti 中顯示中文”

  1. xuhj 說道:
    2008 年 05 月 26 日 at 下午 4:58

    $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);
    }
    这一添加会出现问题

    回覆
  2. .K.T. 說道:
    2008 年 05 月 28 日 at 上午 12:00

    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)

    你再試試看吧
    如果有其他問題
    歡迎一起討論喔!

    回覆
  3. JTY 說道:
    2008 年 07 月 06 日 at 下午 11:30

    這個做法在 CactiEZ v0.4 (0.8.7b) 上打中文實做後會出現?…所以不知有人在這個版本成功嗎 ? 或是我漏掉了什麼 … 都已經檢查 2次,好羨慕做出來的人…唉~

    回覆
  4. .K.T. 說道:
    2008 年 07 月 07 日 at 下午 11:16

    JTY 您好!
    雖然我用的不是 CactiEZ
    不過
    我的 Cacti 版本也是 v0.8.7b
    我想同樣的做法應該也可以才對

    你說打中文會出現「?」
    有可能是你的 MySQL 資料庫編碼不是 UTF-8
    我記得
    MySQL 預設的編碼是 latin1
    你可以去 MySQL 裡面看看 Cacti 所用的資料表編碼是否為 UTF-8
    如果不是
    改成 utf8_general_ci 或 utf8_unicode_ci 應該都可以

    你可以看一下
    如果在 MySQL 中可以正確顯示中文
    就差不多成功了

    希望你也可以實做成功!

    回覆
  5. JTY 說道:
    2008 年 07 月 10 日 at 上午 10:08

    .K.T.您好
    我已用您的方法…在CactiEZ 中,成功修改 threshold 的資料並顯示出中文,但就如 xuhj 所說,在 CactiEZ 版本中,若照您最後一個步驟實做後,又會出現亂碼(但我也不知原因及如何修改)。而您說的也沒錯 Cacti 資料庫,因預設為 latin1,所以將部份欄位得修改成utf8_unicode_ci 就解決了另一個問題。

    無論如何…我非常感恩,終於"又"有進展了。只可惜show 出的圖還是只能顯示英文,但我已非常的高興了。

    回覆
  6. .K.T. 說道:
    2008 年 07 月 11 日 at 上午 12:10

    JTY 您好!

    如果說
    你在 MySQL 中可以看到中文的資料
    那 $cnn_id->Execute("set names 'utf8'"); 這一行可以不用加
    因為加上這一行的用意是為了在連線到資料庫時
    將所使用的編碼改成 UTF-8
    既然在 MySQL 中都正確地寫入中文資料了
    那就不用刻意地將編碼改成 UTF-8 了

    另外
    我最後一個步驟將 htmlentities() 修改成 htmlspecialchars()
    這兩個函式的用途我在備註有寫到
    不知道你遇到的問題是什麼

    回覆
  7. JTY 說道:
    2008 年 07 月 11 日 at 下午 2:20

    是我說錯了~最後一個步驟得將 htmlentities() 修改成 htmlspecialchars() 是要依您的步驟執行。sorry …一時手誤 !
    而是執行
    if ($cnn_id->PConnect($hostport,$user,$pass,$db_name)) {
    $cnn_id->Execute("set names 'utf8'");<才會讓 threshold 資料有亂碼產生
    近期也在測試及尋找圖形中 |host_description| 位址不會出現亂碼的方法,但這次已不是 ?? 的符號,而是一堆亂碼,希望您可能指點迷津…這會 " 我及對cacti的使用者" 興奮不已。

    回覆
  8. .K.T. 說道:
    2008 年 07 月 11 日 at 下午 10:00

    我想
    應該是你之前建 threshold 資料的時候
    用的編碼不是 UTF-8
    所以存在資料庫中的資料不是以 UTF-8 編碼
    一旦將連線所用的編碼改掉
    因為改用 UTF-8 去讀這些資料
    就會出現亂碼

    我猜
    你將 $cnn_id->Execute("set names 'utf8'"); 加上去之後
    再重新修改一次 threshold 資料(或加上新的資料)試試
    如果跟我想的一樣
    改完之後應該就成功了!

    回覆
  9. 黃仁志 說道:
    2009 年 02 月 17 日 at 下午 2:13

    請問一下.Cacti畫出來的圖中文字無法正常顯示.請問該怎麼解決?
    資料庫和網頁都已經是UTF-8了
    請先進指教,謝謝!

    回覆
  10. .K.T. 說道:
    2009 年 02 月 20 日 at 下午 8:39

    我架 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
    本身支不支援中文

    以上這些希望可以幫到你
    若有問題
    我們再來討論討論吧!

    回覆
  11. .K.T. 說道:
    2010 年 08 月 18 日 at 下午 1:32

    昨天將公司裡的 Cacti Server 更新到 Version 0.8.7g
    發現 Cacti 所畫的圖中
    也有部分資料沒辦法顯示中文
    花了不少時間終於查出
    是 lib/functions.php 中的函數 cacti_escapeshellarg 過濾字串時所造成
    所有非 ASCII 的文字均無法正常顯示

    解決方法為.........
    加上 setlocale(LC_CTYPE, "zh_TW.UTF-8");
    之後中文就可以正常顯示了!

    回覆

Leave a Reply

點這裡取消回覆

近期文章

  • Rsyslog to Php-Syslog-NG DB
  • Cacti 安裝過程紀錄
  • Merry Christmas~~
  • Just Do It!
  • 新網址

近期回應

  • GuestBook(3 則回應)
    • .K.T.:...
    • ms:K.T.的腳步聲...
  • 增加 SELinux Policy(1 則回應)
    • .K.T.:剛剛在「酷學園」看到一份關於...
  • 網址前的小東西(4 則回應)
    • .K.T.:就是因為向 CA 申請要花錢...
  • 設定 iptables(3 則回應)
    • .K.T.:感謝樓上的補充!

分類

  • 好文共賞
  • 工作雜記
  • 心情隨筆
  • 投資理財
  • 有趣玩物
  • 站務資訊
  • 資訊相關
  • 音樂隨想

好友的站

  • Blue's Blog
  • Cookies 的 Blog

噗浪一下

網誌功能

  • 登入
  • 文章 RSS 訂閱
  • 迴響 RSS 訂閱
  • WordPress.org
rss RSS 迴響 valid xhtml 1.1 design by jide powered by Wordpress get firefox Creative Commons License
.K.T.'s Blog由.K.T.製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款釋出。