第一部曲:
要使用Delphi for PHP的update1版,之前的版本雖然也能達到頁面內容顯示中文的目標,但這不是完全的中文支持。
有了Delphi for PHP編程軟件後,新增一個form頁面,只要將form的encoding屬性設為GB2312或utf-8,即可實現頁面正常顯示中文。
第二部曲:
本論壇及網上其他地方對控件的中文支持有不同描述,本人經過整理,其實現步驟是:1、修改apache2的配置文件,讓其應用utf-8字符集(注意同時修改http.conf和httpd.template.conf文件,以免被delphi for PHP啟動時復原);2、設置Delphi for php,讓其應用utf-8字符集,同時也讓php應用utf-8字符集;3、修改PHP配置文件,讓其應用utf-8字符集(同時修改php.ini和PHP.ini.template文件,原因同上),這部分的設置似乎在第2步已經完成了,當然用另一種方式設置一下也沒關系啦。
至此,在Delphi for PHP中將form的encoding設為utf-8,即可完全實現控件的中文支持。
到這一步後,數據庫控件其實在代碼層次已經支持中文了,但由於MySQL數據庫與PHP在字符集一致性等方面的原因,仍會顯示亂碼。
第三部曲:
MySQL 4以上的字符集支持(Character Set Support)有兩個方面:字符集(Character set)和排序方式(Collation)。對於字符集的支持細化到四個層次: 服務器(server),數據庫(database),數據表(table)和連接(connection)。
因此需要將MySQL和PHP的默認字符集都設為utf-8,如此設置以後,我們會發現一個問題:用delphi for php生成的php程序提交的中文數據,用phpmyadmin查看是亂碼,但用原提交程序查看卻一切正常;另一方面,用PHPmyadmin輸入的中文數據,用Delphi for php生成的php程序查看是亂碼,但用PHPmyadmin查看卻正常。
由此我們可以推斷出:數據在傳輸及存儲環節出現了字符集的不一致。
問題就出在這個connection連接層上!一般情況下,PHP連接MySQL編碼方式,如果沒有顯式的聲明編碼方式,都將使用latin1編碼。一般的程序,都沒有顯式聲明 ,所以,都是將utf8文本按latin1編碼方式存在數據庫,PHPMyAdmin再用utf8格式讀取,肯定是亂碼。如果PHP程序按正確的編碼存入數據庫,肯定是沒有問題的。
因此需要顯式聲明如下變量:
SET character_set_clIEnt=’utf8’
SET character_set_connection=’utf8’
SET character_set_results=’utf8’
上述聲明與 SET NAMES ’utf8’等價,如此以來,解決問題的關鍵就變成了如何將 SET NAMES ’utf8’ 放入Delphi for PHP程序並使其有效。
其實非常簡單,在form中找到數據庫控件,在其OnAfterConnect事件中加入一行:$this->控件名->execute('set names utf8');
一切OK!