ver0.1.0 utf-8環境での不具合


投稿ツリー


前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2010/7/5 16:20
AXYZ-SAK  新米   投稿数: 13

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)
 ……という感じにするしかないのかな、とも思ったりします(^^;

投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2010/7/5 19:51 | 最終変更
なーお  長老   投稿数: 1744

AXYZ-SAKさん、こんにちは。

mb_substr関数は、byte指定ではなくて文字数指定ですよね。 :roll:

そのため、

  • 日本語: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)

という感じで。(他に応用は効きませんが。。)
トリッキーな方法ですが、もし検証いただければ助かります。

投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2010/7/7 9:35 | 最終変更
AXYZ-SAK  新米   投稿数: 13
引用:
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
ちなみにこれも、当該症状の発生している環境でテストしましたが
正常動作いたしました。

投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2010/7/8 7:22
なーお  長老   投稿数: 1744

AXYZ-SAKさん、こんにちは。

検証、および改善案のご報告、ありがとうございます。 :-)

引用:

これを、$str_enco = _CHARSET; にしちゃった方が現実的かな、とw

なるほど、_CHARSETですか。
ちょっと迷いますね。また別の環境でおかしくなる可能性もありそうな。。

やはりこの方法はトリッキーで不安定かもしれませんので、次回以降のバージョンでは方式を変更するかもしれません。 それまでは、カレンダーの曜日が文字化けしたらAXYZ-SAKさんの方法で対応いただくようにお願いします。(ご使用の皆様)

では。

投票数:0 平均点:0.00
返信する

このトピックに投稿する

題名
ゲスト名
投稿本文
  条件検索へ