We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 14818
    • 10 Posts
    こんばんは

    Dittoを使って表示しているドキュメントの日付の表示を
    2007年05月08日
    のようにしたくて

    &dateFormat=`%Y年%m月%日`

    としましたが文字化けしてしまいます。
    どのように指定すれば意図どおり表示できるか教えていただけないでしょうか?
    ※サイトの文字コードはutf-8です。
      • 33488
      • 429 Posts
      そういえば、・・・%y年 %m月 %d日 と間にスペース入れてますね。
      確かに、くっ付いた状態で渡すと%mのまま表示されてたような・・・詳しく調べてなかったので、とりあえず空白入れて対処しちゃいました。

      時間が取れたら対処できるかどうか調べてみようと思いつつ・・・

        • 33488
        • 429 Posts
        肝心な修正を書くのを忘れてました。
        Ditto.class.inc.phpの中にstrftimeを呼んでる箇所が2箇所あり、UTF-8のときにはutf8encodeを被せてます。
        これを外してください。
        これで、文字化けはなおるはずですが、上記のように空白を入れないと駄目な場合もあります(というか、Ditto2からなぜかそうなちゃってるんですが・・・これはまだ未解決)。

        ということで、まずは上のstrftimeの箇所を修正してみてください。
          • 14818
          • 10 Posts
          ZeRo さん

          strftimeの箇所を修正することで無事文字化けが解消しました。
          どうもありがとうございました。
            • 19033
            • 892 Posts
            こんにちは。

            Ditto2.1bata & MODx0.9.6 で確認しました。

            2.1bata では、ditto.class.inc.php の該当箇所は、1カ所になっていて、919行目付近
            	function formatDate($dateUnixTime, $dateFormat) {
            		global $modx;
            		$dt =  strftime($dateFormat, (intval($dateUnixTime) + $modx->config["server_offset_time"]));
            //		if ($modx->config["modx_charset"] == "UTF-8") {
            //			$dt = utf8_encode($dt);
            //		}
            		return $dt;
            	}

            上記のように3行をコメントアウトすることで、文字化けは解消されました。
            尚、Dittoコール側では、「&dateFormat = ’%Y年%m月%d日 %R’」と、スペースを入れなくても
            大丈夫になってるようです。
              • 27086
              • 37 Posts
              こんにちは。

              utf8_encoding()には、ditto以外でも悩まされる場合があります。先々を考えるとdittoで多言語を考慮したコーディングをするように変更してもらった方が良いように思います。

              基本的には$dtがISO-8859-*の文字範囲であることを想定しているんだと思いますが、この部分に多言語の文字列が入る可能性があるとすれば、mb拡張があれば
              $dt = mb_convert_encoding($dt, ’UTF-8’);
              なければiconvあたりをチェックして、最後にutf8_encodingを採用する感じでしょうか。

              日本語環境を考慮した上でのphpしか経験がないので、逆に ISO-8859-* のみの環境を考慮するとどうすればいいか明確な答えが分かりません。
              あるソースで、設定されている(そのプログラム上の設定です)文字コードによって utf8_encoding か iconv か mb_convert_encoding のいずれかで分岐処理しているのを見たことがあるのですが、そうするのが正解でしょうか。。。
              詳しい方の見解をお聞きしたいです。

              #フランス語コミュニティに同じことで悩んで、別解を提示しているスレッドがありましたので追記しておきます。
              http://modxcms.com/forums/index.php?topic=15672.0
              ロケールがutf-8でなければutf8_encodeするようになっていますが、ロケールがeucだったりするとダメなんじゃないかなぁ。。。