ver0.1.0 utf-8環境での不具合
- このフォーラムに新規トピックを投稿できます
- このフォーラムではゲスト投稿が許可されています
投稿ツリー
- ver0.1.0 utf-8環境での不具合 (AXYZ-SAK, 2010/7/5 16:20)
- Re: ver0.1.0 utf-8環境での不具合 (なーお, 2010/7/5 19:51)
- Re: ver0.1.0 utf-8環境での不具合 (AXYZ-SAK, 2010/7/7 9:35)
- Re: ver0.1.0 utf-8環境での不具合 (なーお, 2010/7/8 7:22)
ver0.1.0について、UTF-8環境に於ける不具合を確認しました。
[症状]
カレンダー部の曜日表記が文字化けします。
[原因]
xoops_trust_path/modules/d3diary/includefunction.php内の
言語ファイルからの曜日呼び出しにおいて、
例)mb_substr(constant("_MD_W_SUN"),0,2)
となっているため、2byteだけが切り出され、3byteである
urf-8ではコケる状態です。
[取り急ぎの対応と結果]
決め打ちでmb_substr(constant("_MD_W_SUN"),0,3)にしたところ
文字化けは解決しました。
[根本的な解決をするとしたら……]
$mod_w_byte みたいな変数を設定したうえで、
languageがja_utf8かどうかをチェックして、その場合は $mod_w_byte=3、
そうでない場合は $mod_w_byte=2 として、
mb_substr(constant("_MD_W_SUN"),0,$mod_w_byte)
……という感じにするしかないのかな、とも思ったりします(^^;
AXYZ-SAKさん、こんにちは。
mb_substr関数は、byte指定ではなくて文字数指定ですよね。
そのため、
- 日本語:1文字の文字列から2文字を取り出す・・1文字取得
- 英語 :3文字の文字列から2文字を取り出す・・2文字取得
となるはずなんですが、、
(ver0.09でUTF-8環境で、問題の報告はありませんでした)
調べるとphpのロケール関連で環境依存になりそうですね。 手元にUTF-8などの3バイト文字ロケール環境が無いので検証できないのですが、例えば、以下のような感じでどうでしょうか。
(mb_substrがfalseを返すようですと元も子も無いですが。。)
$str_enco = mb_internal_encoding();
$str_temp1 = mb_substr(constant("_MD_W_SUN"),0,2,$str_enco);
$str_temp2 = mb_substr(constant("_MD_W_SUN"),0,2);
$wk_strlen = ($str_temp1 != $str_temp2) ? 3 : 2;
とした上で、それぞれの切り出し部分は
mb_substr(constant("_MD_W_SUN"),0,$wk_strlen)
という感じで。(他に応用は効きませんが。。)
トリッキーな方法ですが、もし検証いただければ助かります。
mb_substr関数は、byte指定ではなくて文字数指定ですよね。
おぅ……確かに。
すっとぼけてました _| ̄|○
調べるとphpのロケール関連で環境依存になりそうですね。
手元にUTF-8などの3バイト文字ロケール環境が無いので検証できないのですが、
例えば、以下のような感じでどうでしょうか。
(mb_substrがfalseを返すようですと元も子も無いですが。。)
検証してみたところ、みごとにコケました。
で、mb_internal_encodingの返り値を見てみたら……ISO-8859-1。
どうやら、当該サーバのphp.iniで、mbstring.internal_encodingがpassに
指定されているようで。
まぁ、広汎かつ多岐にわたって使用される事を前提にしたサーバだと
あってもおかしくはない設定ではあります。
で、その辺を鑑みた場合……
$str_enco = mb_internal_encoding();
これを、$str_enco = _CHARSET; にしちゃった方が現実的かな、とw
ちなみにこれも、当該症状の発生している環境でテストしましたが
正常動作いたしました。
AXYZ-SAKさん、こんにちは。
検証、および改善案のご報告、ありがとうございます。
これを、$str_enco = _CHARSET; にしちゃった方が現実的かな、とw
なるほど、_CHARSETですか。
ちょっと迷いますね。また別の環境でおかしくなる可能性もありそうな。。
やはりこの方法はトリッキーで不安定かもしれませんので、次回以降のバージョンでは方式を変更するかもしれません。 それまでは、カレンダーの曜日が文字化けしたらAXYZ-SAKさんの方法で対応いただくようにお願いします。(ご使用の皆様)
では。