WADAX共用サーバー、smartyを利用し、Shift-JIS でのサイト構築を検討しております。

この点、Shift-JISでのテンプレート出力はうまくいったのですが、
テンプレートからのデータベースへの登録がどうしてもうまく行きません。
具体的には、PHPファイルから実行すべきsql文を、
phpMyAdminから実行すると正しく登録できるのですが、
PHPファイルからだと日本語部分が文字化けを起こします。
8時間以上はまっておりますので、
恐れ入りますがご教授くださいますよう、お願いいたします。

■smarty関連
version 2.6.22

■MySQL関連
クライアントversion: 4.1.22
文字セット: UTF-8 Unicode (utf8)
接続照合順序: UTF-8 Unicode (utf8)

■PHP関連
Version 5.2.8
mbstring.http_input:pass
mbstring.http_output: pass
mbstring.internal_encoding: no value
mbstring.language: Japanese

■html(テンプレート)関連
metaタグ: <meta content="text/html; charset=Shift-JIS" http-equiv="content-type">
ファイル自体の文字コード: EUC

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:
  • 終了:2009/02/16 14:13:57
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント35pt

■MySQL関連

クライアントversion: 4.1.22

文字セット: UTF-8 Unicode (utf8)

接続照合順序: UTF-8 Unicode (utf8)

まず、この設定が間違っています。

MySQL(サーバ)のバージョンが4.1.22ですよね?


my.cnf を以下のように変更/追加してください。

[mysqld]
default-character-set = sjis

[mysqldump]
default-character-set = sjis

[mysql]
default-character-set = sjis

参考サイト

■html(テンプレート)関連

metaタグ: <meta content="text/html; charset=Shift-JIS" http-equiv="content-type">

ファイル自体の文字コード: EUC

次にこの設定も間違っています。charset=Shift-JIS を指定しているのですから、ファイルもシフトJISにしなければなりません。


■PHP関連

mbstring.internal_encoding: no value

これは間違いではありませんが、PHP内で日本語の処理をしているなら、no value ではなく SJIS にしてください。no value のままだと検索・置換などの処理で不具合が起きる場合があります。

id:kyoto-jin

ご回答ありがとうございます。

まず利用中のサーバーではmy.cnfが修正できませんので、

一旦以下のような設定をしました。

■MySQL関連

文字セット: UTF-8 Unicode (utf8) ←変更不可

接続照合順序: sjis_japanese_ci

■テンプレート関連

ファイル自体の文字コード: Shift-JIS

■エンコード関連(.htaccessによる)

php_value mbstring.internal_encoding SJIS


■エンコード関連(php内での処理)

一旦、全て元に戻す


これでも解決はせず、

さらにデータベースから呼び出した文字が化けてしまいました。

ですので以下の方法を試しました。


■phpファイルに以下の文を挿入

~結果~

・DBからの文字呼び出し → 正常

・テンプレート直書き文字呼び出し → 文字化け

・テンプレートからDBへの登録 → 文字化け

【ファイルA.php】

--------------------------------

~省略~

function SJIS_Encoding($tpl_output, &$smarty){

$tpl_output = mb_convert_encoding($tpl_output,'Shift-JIS','EUC-JP');

return $tpl_output;

}

--------------------------------------------

【ファイルB.php(実行ファイル)】

--------------------------------

require_once( "ファイルA.php" );

~省略~

$smarty->register_outputfilter("SJIS_Encoding");

$smarty->display( "ファイルA.tpl" );

--------------------------------------------


■ファイル自体の文字コードをEUCで保存

~結果~

・DBからの文字呼び出し → 正常

・テンプレート直書き文字呼び出し → 正常

・テンプレートからDBへの登録 → 文字化け

■phpファイルに以下の文を挿入

~結果~

・DBからの文字呼び出し → 正常

・テンプレート直書き文字呼び出し → 正常

・テンプレートからDBへの登録 → 文字化け

【ファイルA.php】

--------------------------------

~省略~

function convert_encoding_to_eucjp($template_source, &$smarty) {

if (function_exists("mb_convert_encoding")) {

$enc = mb_detect_encoding($template_source, "auto");

if ($enc != "EUC-JP") {

return mb_convert_encoding($template_source, "EUC-JP", $enc);

}

}

return $template_source;

}

--------------------------------------------

【ファイルB.php(実行ファイル)】

--------------------------------

~省略~

$smarty->register_prefilter('convert_encoding_to_eucjp');

--------------------------------------------



このような状態です。

恐れ入りますがご教授願います。

2009/02/12 16:06:54
id:pahoo No.2

回答回数5960ベストアンサー獲得回数633

ポイント35pt

それでは、MySQLにSQLを発行する前に、下記のように SET NAMES文を指定してみてください。

SET NAMES SJIS;
id:kyoto-jin

ご回答ありがとうございます。

以下の内容でSQL発行を試みましたが、

まだ文字化けは解消されませんでした。

SET NAMES SJIS

SET NAMES EUC-JP

SET NAMES Shift-JIS

SET NAMES UJIS

SET NAMES UTF8

何卒ご教授のほど、宜しくお願いいたします。

2009/02/13 12:22:56

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • WADAXレンタルサーバー レンタルサーバー比較DB++~口コミ・評判~ 2010-02-07 09:25:37
    WADAXレンタルサーバー WADAXレンタルサーバーの口コミ・評判! アクセスありがとうございます!! WADAXレンタルサーバー の評判や口コミを集めましたよ(・∀・) さて、どんな口
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません