Cacti 中顯示中文

由於最近要將原有Cacti遷移至集成好的CactiEZ上,中間遇到了許多問題,其中mysql的原有數據庫中的中文亂碼了,原有數據庫為UTF-8,而CactEZ上是latin,上網查詢找到了以下辦法

 

首先
必須將 MySQL 的預設編碼改成 UTF-8
透過修改 MySQL的設定檔

vim /etc/mysql/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-&gt;Execute("set names 'utf8'");

我是將原本的

if ($cnn_id-&gt;PConnect($hostport,$user,$pass,$db_name)) {
return(1);
}

改成

if ($cnn_id-&gt;PConnect($hostport,$user,$pass,$db_name)) {
$cnn_id-&gt;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"])

Done

注:

  1. htmlentities():這是一個 PHP 的函式,將所有 String 的字元都轉成 HTML 的特殊字集字串,所以才造成中文顯示成亂碼。
  2. htmlspecialchars():這也是一個 PHP 的函式,跟 htmlentities() 不同的地方在於,這個函式只轉換一些特殊字元,而不全部轉換成 HTML 所定的 ASCII 轉換,所以中文就不會被改成亂碼了。