We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 33488
    • 429 Posts
    ありがとうございますだ。
    v2どうしましょーかねぇ、ココでこのままでも・・。
    v1の方がお手軽さはありますね。
      • 19033
      • 892 Posts
      こんにちは。よろしくお願いいたします。

      locale settingを導入していると、ある環境下で、一部の文字が文字化けすることを見つけました。
      検証したのは、さくらインターネットとXREA+です。

      さくらインターネットの方は、サーバーのロケール設定が有効ではありません。
      いっぽう、XREA+は、サーバーのロケール設定が有効です。

      文字化けするのは、PHxの「strip」を使ったときだけに出る模様です。
      従って、PHxファンクションを利用している、Ditto及び、Jotなどのなかで、
      「strip」を利用していると文字化けします。

      簡単な例を作ってみました。
      ・さくらインターネット
       http://www.liolion.info/modx/dittotest.html
      ・XREA+
       http://www.liolion.net/dittotest.html
      (外見違いますが、さくらで文字化けしている文章を使っています。)

      Ditto call
      [[Ditto? &language=`japanese-utf8` &parents=`61` &tpl=`ditto_phx_test` &display=`all`]]

      チャンク
      <h2>[+longtitle+]</h2>
      <p>[+introtext:notags:strip+]</p>


      上記の「strip」を取れば、さくらでも、文字化けしません。どう対処したらよいでしょうか。。

      1.ロケール設定が有効でない、サーバーには、local setting は導入しない。
      2.「strip」をあきらめる
      3.......

      なお、Dittoは、最新バージョン(2.1)じゃないんで、後でまた試してみますが、
      Jotでも同じ現象は出ているんで、stripを使う限り、同じかも。。

      なにか、手がかりがありましたら、よろしくお願いいたします。。
        • 19033
        • 892 Posts
        別にDittoにしなくても良かったんでした...。

        [*introtext:notags:strip*]

        で、さくらの方は、文字化けし、XREA+は、文字化けしません。
        一応、直前のポストの例の、水平線の下の部分は、[*introtext:notags:strip*]で
        出したものです。水平線の上は、直前のポストの通り、Ditto とチャンクで出したものです。
          • 33488
          • 429 Posts
          さっぱり、わからんっすね
          PHxのstripの処理は改行コード(CR/LF)と空白文字、タブコードを半角空白にしている処理みたいなんですよね。
          これとlocaleの設定が絡むっていうことがまったくわからん感じです。

          試しに、Ver2.0って書いた言語ファイルを呼び出すものじゃないバージョンで、LC_ALLではなくてLC_TIMEで行っても同じ事象になりますでしょうか?
          LC_TIMEで指定すれば、strftimeのときのみに影響するだけだと思うので、これでもなるとすると・・・PHPそのものが疑わしいような・・・。
          もちろん、まあPHP本体の不具合もありえなくはないので、環境の違いがPHPのバージョンも含まれているとしたらその可能性はあるかもです。
          ロケールの設定で影響されるのは下記のマニュアルの記載の通りという前提ですが・・・。
          http://manual.atseason.com/function.setlocale.html
            • 19033
            • 892 Posts
            ZeRoさん。ありがとうございます。

            まず、整理しますと。
            私がさきほど試していたのは、ZeRoさんが、
            一番最初に作って下さったもので、リポジトリに登録してあるものです。
            (プラグイン設定を書かないヤツ)。これだと化けていました。

            今、以下のコードでやってみたら、文字化け直りました!ありがとうございます。
            /*
             * LOCALE SETTING Plugin2
             *
             * 2008/04/08 ZeRo ver1.0a
             *
             * Event:OnWebPageInit
             * paramter:&locale=locale;text;ja_JP.utf-8
             * or
             * $locale="ja_JP.utf-8";
             *
             */
            $e = & $modx->Event;
            // $locale="ja_JP.utf-8";  
            
            if  ($e->name == "OnWebPageInit" && !empty($locale) )  {
             setlocale(LC_TIME,$locale);
            }

            ↑プラグイン設定に「&locale=locale;text;ja_JP.utf-8」と書く。

            これは、以下でZeRoさんが書いて下さったコード(そのまま)です。
            http://modxcms.com/forums/index.php/topic,24251.msg151025.html#msg151025

            ということは、登録してあるのを非推奨にして、上記のコードを登録し直した方がよいですよね。
              • 33488
              • 429 Posts
              ということは、LC_TIMEをLC_ALLにすると 文字化け起こります???
              LC_ALLで影響が出るとすると、strftime以外の関数がPHxで使われているstr系でなんかあるってことに・・・こうなるとPHPそのものが疑わしくなってくるような・・・。
              strtoupperとか日本語で関係ないですしねぇ・・・マニュアルと実際のPHPの動きが違う可能性もあるかも。

              とりあえず、日時だけであればLC_TIMEの指定の方が無難ですねぇ。 
              後は通貨ぐらいしか必要ないかなぁ と。
                • 19033
                • 892 Posts
                こんにちは。

                ということは、LC_TIMEをLC_ALLにすると 文字化け起こります???
                いえ。以下にしてやってみましたが、文字化けしません。
                if  ($e->name == "OnWebPageInit" && !empty($locale) )  {
                 setlocale(LC_ALL,$locale);


                ...ということで、LC_TIME と LC_ALL とどちらにしておいた方がいいのでしょうか。。