人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: kyoto-jin
●カテゴリ:ウェブ制作
✍キーワード:EUC HTML JIS MySQL PHP
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● pahoo
●35ポイント

■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 のままだと検索・置換などの処理で不具合が起きる場合があります。

◎質問者からの返答

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

まず利用中のサーバーでは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');

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



このような状態です。

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


2 ● pahoo
●35ポイント

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

SET NAMES SJIS;
◎質問者からの返答

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

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

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

SET NAMES SJIS

SET NAMES EUC-JP

SET NAMES Shift-JIS

SET NAMES UJIS

SET NAMES UTF8

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ