機能要望 > その他 > UTF-8でお知らせの文字化け修正 |
その他
スレッド表示 | 古いものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
ramrun |
投稿日時: 2007/4/26 0:13
対応状況: −−−
|
仙人 登録日: 2006/11/3 居住地: 投稿: 789 |
Re: UTF-8でお知らせの文字化け修正 ながらくお付き合いいただき、ありがとうございました。
おかげさまで謎が解けました。 とりあえず.htaccessでやっておこうと思います。 人様のサイトですが、UTF-8の記事を書かれたようなので、参考に貼らせていただきます。 つぶやき。もしくは独り言。 http://shizuki.kinezumi.net/NucleusCMS/item_475.html |
nanasess |
投稿日時: 2007/4/24 17:05
対応状況: −−−
|
神 登録日: 2006/9/9 居住地: 投稿: 2313 |
Re: UTF-8でお知らせの文字化け修正 大河内です.
ちょっと現実逃避に, mbstring.c のソースをざっと見てみました. ramrun さんのおっしゃる通り, --enable-zend-multibyte が有効になってないと, mbstring.script_encoding は有効になりません. 従って, null となるようです. この場合, mbstring.internal_encoding と ファイルエンコーディングは同様とみなされるようです. エンコーディング変換が行われるのは, スクリプトを読み込む際なので,php.ini で mbstring.internal_encoding = EUC-JP だと, ファイルエンコーディングが UTF-8 なのにもかかわらず, EUC-JP だと仮定して読み込み, 内部(ini_set が実行されるタイミング)で UTF-8 に変換されます. ここでエンコーディングのミスマッチが発生していたと思われます. ramrun さんの環境なら, mbstring.encoding_translation = off の対応で良さそうですが, やはりモバイル版の方で何らかの対応は必要になると思います. (http_input が SJIS-win に強制されるため) また, PHPが想定しないような設定だと思われますので, あまり気持ちの良いものではないかもしれませんね. モバイル版でしたら, Firefox に User Agent Switcher を入れて User-Agentを偽装して確認もできるので, 買い換えにご無理なさらなくても大丈夫かと ^^; php.ini の設定が EUC-JP で, ini_set で動的に UTF-8 に設定されているのが問題だと思いますので, ini_set で動的に設定せずに, php.ini または, .htaccess で設定してやれば問題ないと思います. # これを PHP の開発チームに報告するべきか否か... # 報告したとしても, バグとしてではなく, 「ちゃんと設定して」って言われそう... ちなみに, --enable-mbstr-enc-trans は, PHP4.3.0 以降は常に On のようです. ramrun さんの環境でしたら, --enable-zend-multibyte を有効にしなくても, 今のままの configure option で良さそうな感じですね. |
ramrun |
投稿日時: 2007/4/24 12:32
対応状況: −−−
|
仙人 登録日: 2006/11/3 居住地: 投稿: 789 |
Re: UTF-8でお知らせの文字化け修正 説明を読んで、なるほどと理解しました。
ですが
上記は試せませんでした(汗)。 php.iniに mbstring.script_encoding = UTF-8 としてみたり、php_ini.incに ini_set("mbstring.script_encoding", "UTF-8"); としてみたり、.htaccessに php_value mbstring.script_encoding UTF-8 としてみましたが、phpinfo()で項目が表示されませんでした。 どうやら、mbscript.script_encodingを有効にするにはphpのconfigureオプションで最低、 --enable-zend-multibyte --enable-mbstring --enable-mbstr-enc-trans とする必要があるみたいですが、enablel-zend-multibyteがオプションに見当たりません。 phpinfo()で確認する限り、現状は下記の3つでした。 --enable-mbstring --enable-mbregex --enable-mbstr-enc-trans そもそもmbscript.script_encodingが有効であれば、php.ini等に記述がなくてもno valueとして、phpinfo()に項目は確認できますよね? それが無いんです(汗)。 LinuxVPSサーバーでCentOS4でyumによるrpmのインストールです。 さて、どうしたものかと。 ソースからインストールしてしまうと、確認がとりずらくなるから、確実にmbscript.script_encodingとの因果関係をチェックするためにはrpmをリビルドしたほうがいいですかね(汗)。 あとモバイルは確認できませんです... いえ、私が持ってる携帯が、それはそれはすばらしい携帯なので(笑)。 買い替えなきゃいけません。 |
nanasess |
投稿日時: 2007/4/23 17:49
対応状況: −−−
|
神 登録日: 2006/9/9 居住地: 投稿: 2313 |
Re: UTF-8でお知らせの文字化け修正 大河内です.
原因がだいたい解ったような感じです. 検証してないので, はずしているかもしれませんが... まず, mbstring.script_encoding が定義されてなさそうですので, この値が null と仮定します. そうすると, PHPの内部エンコーディング(mbstring.internal_encoding) は, まず php.ini の EUC-JP が適用されている状態となります. ということは, PHP スクリプトを実行しない状態では, ファイルエンコーディングが UTF-8 なのにもかかわらず, mbstring.script_encoding が EUC-JP となると思われます. mbstring.http_input が UTF-8 となっていますので, UTF-8 で入力されますが, 何らかの原因(おそらく, mbstring.encoding_translation が on のため)で, エンコーディング変換をしようとし, mbstring.substitute_character が none のため, 空文字に変換されて出力してしまうのではないでしょうか. そこで, mbstring.encoding_translation off でエンコーディングの内部変換をしないように設定すると, 正常に出力されるようになる...と思われます. 下記のようになるよう設定してみてはいかがでしょうか?
また, こうした場合, モバイル版の検索では文字化けしたり, 検索できなかったりということはありませんでしょうか? モバイル版では, .htaccess で mbstring.encoding_translation 0 になるので, GET の文字列が SJIS のまま渡されそうです. したがって, mbstring.encoding_transration on にした上で, html/products/list.php の 84行目付近や, 99行目あたり, $_GET['name'] の箇所を,
このように rawurldecode で SJIS のバイトコードに正しく decode してやった上で, UTF-8 にエンコーディング変換してやらないと正しく動作しないような気がします. このあたりも正確に検証しておりませんのではずしているかもしれません... PHP 4.3.9 なのは関連性はないと思います. 正確には, テストスクリプトを作成して検証しなければならないのと, mbstring モジュールのソースコードを確認しなければわかりませんね... # ゴミになってしまったらスミマセン... |
ramrun |
投稿日時: 2007/4/23 15:46
対応状況: −−−
|
仙人 登録日: 2006/11/3 居住地: 投稿: 789 |
Re: UTF-8でお知らせの文字化け修正 いえいえ。
こちらの環境のせいかもしれませんのでお気遣いなく(汗)。 引用: 検索結果のページに php_info() を書いて... これが不思議なんです。 php_ini.incに ini_set("mbstring.language", "Japanese"); ini_set("mbstring.internal_encoding", CHAR_CODE); としている場合と、.htaccessに php_value mbstring.language Japanese php_value mbstring.internal_encoding UTF-8 としている場合とで、検索後(list.php)にphpinfo()をいれて確認しても
となり、phpinfo()の結果は同じなんです。 しかし、list.phpの
としてチェックしたとき、 php_ini.inc ini_set("mbstring.language", "Japanese"); ini_set("mbstring.internal_encoding", CHAR_CODE); .htaccess php_value mbstring.language Japanese #php_value mbstring.internal_encoding UTF-8 で、検索欄に 鍋 と入力して検索すると print_r("あああ".$arrSearch['name']."あああ")の結果は空っぽです。 ああああああと表示されます。 php_ini.inc ini_set("mbstring.language", "Japanese"); //ini_set("mbstring.internal_encoding", CHAR_CODE); .htaccess php_value mbstring.language Japanese php_value mbstring.internal_encoding UTF-8 で、同様に検索欄に 鍋 と入力して検索すると print_r("あああ".$arrSearch['name']."あああ")の結果は 鍋 になります。 あああ鍋あああと表示されます。 もしくは php_ini.inc ini_set("mbstring.language", "Japanese"); ini_set("mbstring.internal_encoding", CHAR_CODE); .htaccess php_value mbstring.language Japanese php_flag mbstring.encoding_translation 0 #php_value mbstring.internal_encoding UTF-8 とすれば あああ鍋あああと表示されます。 /etc/php.iniのほうでUTF-8に設定すればいいのですが...(汗)。 ちなみにPHPは4.3.9なのでそのせいかもです。 |
nanasess |
投稿日時: 2007/4/23 9:22
対応状況: −−−
|
神 登録日: 2006/9/9 居住地: 投稿: 2313 |
Re: UTF-8でお知らせの文字化け修正 大河内です.
検索をした場合, 動的に決定される mbstring まわりの設定がどうなっているかによると思います. 検索結果のページに php_info() を書いて, 検索を実行した場合にmbstring の結果がどうなっているか調べればわかるかもしれません. # なかなか検証する時間がとれず...スミマセン. |
ramrun |
投稿日時: 2007/4/20 0:49
対応状況: −−−
|
仙人 登録日: 2006/11/3 居住地: 投稿: 789 |
Re: UTF-8でお知らせの文字化け修正 引用:
mbstring.language string 的外れかもしれませんが、mbstring.languageと絡んでいるのかなぁと思ってます。 php_ini.incでは ini_set("mbstring.language", "Japanese"); : : ini_set("mbstring.internal_encoding", CHAR_CODE); となってますよね。 .htaccessに php_value mbstring.language Japanese : : php_value mbstring.internal_encoding utf-8 とした場合は効いているような。 mbstring.languageがPHP_INI_PERDIRなことと関係があるのかなと思ったんですが...(汗) ちなみにphp.ini(マスター)は [mbstring] ; language for internal character representation. mbstring.language = Japanese ; internal/script encoding. ; Some encoding cannot work as internal encoding. ; (e.g. SJIS, BIG5, ISO-2022-*) mbstring.internal_encoding = EUC-JP : : です。 |
nanasess |
投稿日時: 2007/4/19 22:02
対応状況: −−−
|
神 登録日: 2006/9/9 居住地: 投稿: 2313 |
Re: UTF-8でお知らせの文字化け修正 大河内です.
ご試用ありがとうございます. ファイルエンコーディングを変換して使用した場合の対処法をまとめなくてはと思いつつ, まとまってなくてすみません...汗 できるだけ変更しなくても良いように, 本体で吸収できたらと考えております. 引用:
この部分は, MySQL の方言のせいで, PostgreSQL の場合は処理を変えなくてはいけないんですよね... Java だと, こういった処理を透過的にうまく書けるのですが, PHP でエレガントに書こうと思うと..なかなかいいアイディアが浮かびません... 引用:
http://www.php.net/mbstring を見ると, mbstring.internal_encoding は, PHP_INI_ALL になっているので ini_set でもできるはずなんですけどね... ちょっと調べる必要がありそうですね. |
ramrun |
投稿日時: 2007/4/18 21:41
対応状況: −−−
|
仙人 登録日: 2006/11/3 居住地: 投稿: 789 |
Re: UTF-8でお知らせの文字化け修正 UTF-8変換スクリプトを使わせていただきました。
conf.phpのCHAR_CODEを直しておくだけで、すんなりインストールできました。 ありがとうございます。 あとは html/admin/order/mail.php html/install/user_data/include/campaign/default/active/header.tpl html/install/user_data/include/campaign/default/end/header.tpl html/mobile/products/list.php にEUC-JPの記述があったのと、上記お知らせの件、同じくモジュールの取得部分ができたら良さそう。 個人的にはSC_DbConn.phpにSET NAMESの記述を追加してもらえたら... ::追記:: 検索などの入力が文字化けして悩まされたのですが、 php_flag mbstring.encoding_translation 1 を 0 にすると改善されました。 でもEUC-JPでセッティングしてあるテストサイトではデフォルトでOKなのにおかしいと思って調べてみたら、php_ini.incにある記述で ini_set("mbstring.internal_encoding", CHAR_CODE); が効いていないと思われます。 この記述のみ.htaccessへ移すと、encoding_translationが1でも正常に動作するなりました。 |
nanasess |
投稿日時: 2007/4/7 10:02
対応状況: −−−
|
神 登録日: 2006/9/9 居住地: 投稿: 2313 |
Re: UTF-8でお知らせの文字化け修正 大河内@comuコミットチームです.
有用な情報ありがとうございます. このあたりは, ini_get 関数を使用して, mbstring.* を取得し, 本体の方で自動判別できるようにしたいですね. また, エンコーディングの変換が簡単にできるように, バッチスクリプトを作成しました. よろしければお使い下さい. https://svn.ec-cube.net/open/branches/comu/convert.php (comu にログイン して取得して下さい) cli 版の PHP がインストールされている必要がありますが, EUC-JP -> UTF-8 などのエンコーディング変換が簡単に行えます. |
(1) 2 » |
スレッド表示 | 古いものから | 前のトピック | 次のトピック | トップ |