バージョン選択

フォーラム

メニュー

オンライン状況

81 人のユーザが現在オンラインです。 (52 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 81
もっと...

サイト内検索

機能要望 > その他 > UTF-8でお知らせの文字化け修正

その他

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ゲスト
投稿日時: 2007/4/6 17:48
対応状況: −−−
UTF-8でお知らせの文字化け修正
Version 1.2.0-beta
html/admin/home.php 219行目以降
動作確認済みです。(PHP 5.1.2、MySQL 5.0.18)

// お知らせ取得
function lfGetInfo() {
// 更新情報を最新にする
$objQuery = new SC_Query();
$path = UPDATE_HTTP . "info.txt";
$fp = @fopen($path, "rb");

$arrRet = array();
if(!$fp) {
sfErrorHeader(">> " . $path . "の取得に失敗しました。");
} else {
while (!feof($fp)) {
$arrCSV = fgetcsv($fp, UPDATE_CSV_LINE_MAX);
$cnt = count($arrCSV);
$tmp = array();
for ($i=0; $i<$cnt; $i++) {
$tmp[] = mb_convert_encoding($arrCSV[$i], "UTF-8", "EUC-JP");
}
$arrRet[] = $tmp;
}
fclose($fp);
}

return $arrRet;

}
ゲスト
投稿日時: 2007/4/7 9:29
対応状況: −−−
Re: UTF-8でお知らせの文字化け修正
行数が199行目以降です。
折り返し表示してみてました。すみません、、です。
nanasess
投稿日時: 2007/4/7 10:02
対応状況: −−−
登録日: 2006/9/9
居住地: 四天王寺の近く
投稿: 2038
Re: UTF-8でお知らせの文字化け修正
大河内@comuコミットチームです.

有用な情報ありがとうございます.
このあたりは, ini_get 関数を使用して, mbstring.* を取得し, 本体の方で自動判別できるようにしたいですね.

また, エンコーディングの変換が簡単にできるように, バッチスクリプトを作成しました.
よろしければお使い下さい.

https://svn.ec-cube.net/open/branches/comu/convert.php

(comu にログイン して取得して下さい)

cli 版の PHP がインストールされている必要がありますが, EUC-JP -> UTF-8 などのエンコーディング変換が簡単に行えます.
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/19 22:02
対応状況: −−−
登録日: 2006/9/9
居住地: 四天王寺の近く
投稿: 2038
Re: UTF-8でお知らせの文字化け修正
大河内です.

ご試用ありがとうございます.

ファイルエンコーディングを変換して使用した場合の対処法をまとめなくてはと思いつつ, まとまってなくてすみません...汗

できるだけ変更しなくても良いように, 本体で吸収できたらと考えております.

引用:


個人的にはSC_DbConn.phpにSET NAMESの記述を追加してもらえたら...



この部分は, MySQL の方言のせいで, PostgreSQL の場合は処理を変えなくてはいけないんですよね...
Java だと, こういった処理を透過的にうまく書けるのですが, PHP でエレガントに書こうと思うと..なかなかいいアイディアが浮かびません...

引用:


 ini_set("mbstring.internal_encoding", CHAR_CODE);

が効いていないと思われます。

この記述のみ.htaccessへ移すと、encoding_translationが1でも正常に動作するなりました。


http://www.php.net/mbstring を見ると, mbstring.internal_encoding は, PHP_INI_ALL になっているので ini_set でもできるはずなんですけどね...

ちょっと調べる必要がありそうですね.
ramrun
投稿日時: 2007/4/20 0:49
対応状況: −−−
仙人
登録日: 2006/11/3
居住地:
投稿: 789
Re: UTF-8でお知らせの文字化け修正
引用:
mbstring.language string

mbstring で使用される言語設定(NLS)のデフォルト値。 この設定は mbstring.internal_encoding を定義するため、 php.ini の中で mbstring.internal_encoding は、 mbstring.language の後に置く必要があることに注意してください。


的外れかもしれませんが、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/23 9:22
対応状況: −−−
登録日: 2006/9/9
居住地: 四天王寺の近く
投稿: 2038
Re: UTF-8でお知らせの文字化け修正
大河内です.

検索をした場合, 動的に決定される mbstring まわりの設定がどうなっているかによると思います.

検索結果のページに php_info() を書いて, 検索を実行した場合に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()をいれて確認しても

 mbstring.detect_order			auto		auto
 mbstring.encoding_translation		On		Off
 mbstring.func_overload			0		0
 mbstring.http_input			UTF-8		auto
 mbstring.http_output			UTF-8		EUC-JP
 mbstring.internal_encoding		UTF-8		EUC-JP
 mbstring.language			Japanese	Japanese
 mbstring.substitute_character		none		no value


となり、phpinfo()の結果は同じなんです。

しかし、list.phpの

// 商品名検索条件
if ($_GET['name'] === "") {
	$arrSearch['name'] = "指定なし";
}else{
	$arrSearch['name'] = $_GET['name'];
	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_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 17:49
対応状況: −−−
登録日: 2006/9/9
居住地: 四天王寺の近く
投稿: 2038
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 でエンコーディングの内部変換をしないように設定すると, 正常に出力されるようになる...と思われます.

下記のようになるよう設定してみてはいかがでしょうか?


mbstring.detect_order			auto
mbstring.encoding_translation		On
mbstring.func_overload			0
mbstring.http_input			auto
mbstring.http_output			UTF-8
mbstring.internal_encoding		UTF-8
mbstring.language			Japanese
mbstring.script_encoding                UTF-8
mbstring.substitute_character		none


また, こうした場合, モバイル版の検索では文字化けしたり, 検索できなかったりということはありませんでしょうか?
モバイル版では, .htaccess で mbstring.encoding_translation 0 になるので, GET の文字列が SJIS のまま渡されそうです.

したがって, mbstring.encoding_transration on にした上で, html/products/list.php の 84行目付近や, 99行目あたり,

$_GET['name'] の箇所を,

mb_convert_encoding(rawurldecode($_GET["name"]), "UTF-8", "auto");


このように rawurldecode で SJIS のバイトコードに正しく decode してやった上で, UTF-8 にエンコーディング変換してやらないと正しく動作しないような気がします.

このあたりも正確に検証しておりませんのではずしているかもしれません...

PHP 4.3.9 なのは関連性はないと思います.

正確には, テストスクリプトを作成して検証しなければならないのと, mbstring モジュールのソースコードを確認しなければわかりませんね...

# ゴミになってしまったらスミマセン...
ramrun
投稿日時: 2007/4/24 12:32
対応状況: −−−
仙人
登録日: 2006/11/3
居住地:
投稿: 789
Re: UTF-8でお知らせの文字化け修正
説明を読んで、なるほどと理解しました。

ですが
mbstring.script_encoding        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をリビルドしたほうがいいですかね(汗)。

あとモバイルは確認できませんです...

いえ、私が持ってる携帯が、それはそれはすばらしい携帯なので(笑)。
買い替えなきゃいけません。
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は60,972名です
総投稿数は95,436件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
nanasess
2038
4
468
2022
5
yuh
1612
6
umebius
1588
7
red
1399
8
h_tanaka
993
9
fukap
907
10
tsuji
863
11
shutta
835
12 ramrun 789
13
tao_s
783
14 karin 656
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.