RadPHP XEのサンプルプログラムの一つ「BlogProject」で、登録した文字が文字化けする問題に手間取った。
同じ問題で悩んでいる人がいるかもしれないので、修正方法を書いておきます。
まずMySQLの設定ファイル my.ini を編集して、文字コードの設定を行います。
これは「BlogProject」に限らない一般的な話。
データベースを作成するときに文字コードをUTF-8に設定します。
CREATE DATABASE eblogs DEFAULT CHARACTER SET utf8;
データベースのテーブル定義は、blog_tables.sqlにSQLがあります。
なぜかblogsテーブルのTitleフィールドとContentフィールドに文字コードが「latin1_general_ci」と設定されています。
`Title` varchar(128) collate latin1_general_ci NOT NULL,
`Content` text collate latin1_general_ci NOT NULL,
この設定は不要なので、削除します。
※これに気づくのに時間がかかりました。
`Title` varchar(128) NOT NULL,
`Content` text NOT NULL,
blog_db.phpのDatabase1コンポーネントの設定ですが、「Delphi for PHP で MySQL を使う際の言語設定について | ゆめとちぼーとげんじつと」で、OnAfterConnectイベントで文字コードを設定するSQLを発行する例を見つけました。
function Database1AfterConnect($sender, $params)
{
$this->Database1->execute('SET NAMES utf8;');
}
Database1コンポーネントにCharsetプロパティがあります。
いかにも文字コードに関係がありそうなプロパティですが、具体的に何をしているのかわかりませんでした。
上記の「SET NAMES utf8」と同じことをしてくれそうで、してくれないようです。
ということで、Database1コンポーネントは、OnAfterConnectイベントで文字コードの設定を行います。
Pageクラスを継承しているadmin_edit.phpなどのEncodingを「Unicode(UTF-8)」に変更します。
※一括して変更する方法はないのでしょうか。
admin_edit.phpのOKボタン(Button1コンポーネント)のOnClickイベントを修正します。
$content = textToHtml($this->Memo1->Text);
この行を編集し、文字コードを引数で渡します。
$content = textToHtml($this->Memo1->Text, 'UTF-8');
addcomment.phpとadmin_edit_comment.phpのtextToHtmlも同様の修正を行います。
以上で、一応、日本語を入力して、表示されるようになりました。
※まだ、不満のある動作がありますが…
DatabaseコンポーネントのCharsetプロパティや、MySQLのutf8接続については、これまでのセミナーなどで解説済みですが、こちらもご覧下さい。
[データベースアクセス時のコード系について]
https://forums.codegear.com/thread.jspa?threadID=43229&tstart=0
高橋智宏さま
コメントありがとうございます。
教えていただいたページを見て勉強します。