トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

日本語対応(SkyBlueCanvas) の変更点

Top / 日本語対応(SkyBlueCanvas)

*SkyBlueCanvasの日本語対応 [#cd4ef95a]

いざ使ってみて、一部の機能にて日本語(2バイト文字)がまともに通らなかったのでちょっと修正~
~
管理画面から各ページを作成・修正する際に、本文に日本語を記載する分には問題なかったが、ページのメタデータに日本語を使用すると、xmlファイル書き出し時に文字化けしてしまい、ページの読み込み自体不可能になってしまう。
※/data/xml/page.xml への書き出し時に、文字化けする。

このため、以下のファイルを修正~
/includes/xml.parser.php
160行目

    // $xml .= $indent.$k.'="'.htmlentities($v).'"';
    $xml .= $indent.$k.'="'.htmlspecialchars($v).'"'; 


どうも、htmlentities()にて文字列をHTMLエンティティに変換する際、変な変換しているっぽい。~
他のCMS等でも、同じような文字化けが報告されているので、一応2バイト文字圏独特のバグかな?ということで~
※ちなみに、今回の環境はWebARENA SuiteX上~

***追記: [#aa0ff1b8]
公式フォーラムにて、他言語(フランス語とかドイツ語)での独特の文字への対応方法が提案されていたが、2バイト文字ではやはり問題がおきるので、上記をバグ報告してあります。~
作者から、次バージョンへの組み込みコメントもらっているので、たぶん対応するかと~
(09/01/14)

***追記: &color(red){(09/02/02に公式にて対応済み)};[#oc6b738b]
Page作成時に、日本語で"Menu Text"を記載すると、ページへのリンクが全て"-.html"となってしまいます。~
これは、SAFE_URLのチェックにて、
-アルファベット
-数字
-一部記号
%%Page作成時に、日本語で"Menu Text"を記載すると、ページへのリンクが全て"-.html"となってしまいます。%%~
%%これは、SAFE_URLのチェックにて、%%
-%%アルファベット%%
-%%数字%%
-%%一部記号%%

以外は、一律削除と処理しているためのようです。~
%%以外は、一律削除と処理しているためのようです。%%~

このため、"Menu Text"が日本語のページを複数作ると、Page IDが一番若いページに全てリンクしてしまいます。~
%%このため、"Menu Text"が日本語のページを複数作ると、Page IDが一番若いページに全てリンクしてしまいます。%%~

回避策として、urlencode()を使って、SAFE_URLのチェックを突破させてみたのですが、うまくリンクしないので、ちょっとお蔵入り中。。。~
URLの書き出しはできているが、クリックした際のURLの解釈に問題があるようです。。。 
%%回避策として、urlencode()を使って、SAFE_URLのチェックを突破させてみたのですが、うまくリンクしないので、ちょっとお蔵入り中。。。%%~
%%URLの書き出しはできているが、クリックした際のURLの解釈に問題があるようです。。。%% 

この機能は、SEO対策としてURLをわかりやすい形に変更し、ApacheのRewriteEngineにてURL置換を行っています。~
もうちょっとソース見てみないといけないようです。~
%%この機能は、SEO対策としてURLをわかりやすい形に変更し、ApacheのRewriteEngineにてURL置換を行っています。%%~
%%もうちょっとソース見てみないといけないようです。%%~

では、どうやって回避するかというと~
これも、ソースいじらないといけません。~
%%では、どうやって回避するかというと%%~
%%これも、ソースいじらないといけません%%。~
~
SkyBlueCanvasでは、.htaccessファイルの有無で、RewriteEngineを使用(SEO対策モードで稼働)してしまいます。~
これでは、レンタルサーバ等でphp_value等を設定したい、且つ2バイト文字圏での使用に問題が出てしまいます。~
%%SkyBlueCanvasでは、.htaccessファイルの有無で、RewriteEngineを使用(SEO対策モードで稼働)してしまいます。%%~
%%これでは、レンタルサーバ等でphp_value等を設定したい、且つ2バイト文字圏での使用に問題が出てしまいます。%%~

%%このため、以下のファイルを修正%%~
%%/includes/core.php%%
%%331行目%%

    // define('USE_SEF_URLS', file_exists($this->path . '.htaccess') ? 1 : 0 );
    define('USE_SEF_URLS', 0 ); 


.htaccessファイルの有無で、USE_SEF_URLSのフラグを立てるかどうか判断している部分です。~
この修正で、強制的にUSE_SEF_URLSを使用しないようにしています。~
ただし、あくまで緊急的な例外処理のため、本質的には問題のある修正です。~
一応、このフラグは他のキーに使われていないので、誤作動を起こすことはないと思っています。~
%%.htaccessファイルの有無で、USE_SEF_URLSのフラグを立てるかどうか判断している部分です。%%~
%%この修正で、強制的にUSE_SEF_URLSを使用しないようにしています。%%~
%%ただし、あくまで緊急的な例外処理のため、本質的には問題のある修正です。%%~
%%一応、このフラグは他のキーに使われていないので、誤作動を起こすことはないと思っています。%%~
(09/01/15)

***&color(red){追記:}; [#o7163aa3]
上記対策が、[[公式フォーラム>http://forum.skybluecanvas.com/viewtopic.php?f=19&t=263]]にて対応なされましたので、追記です。~
/include/router.php~
関数2つを置き換え~

    function normalize($str) {
        $str = strtolower(str_replace(
            array('ä', 'ö', 'ü', '&szlg', '&', ' & ', '&', ' - ', '/', ' / ', ' '),
            array('ae', 'oe', 'ue', 'ss', '-and-', '-and-', '-and-', '-', '-', '-', '-'),
            $str
        ));
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789_-%";
        $output = "";
        $str = strtolower($str);
        for ($i=0; $i<strlen($str); $i++) {
            if (false === strpos($chars, $str{$i})) {
                if ($str{$i} == ' '){
                    $output = $output.'-';
                 }
                 else {
                     $output = $output.'%'.dechex(ord($str{$i}));
                 }
            } else {
                $output = $output.$str{$i};
            }
        }
        $str = $output;
        $max = 50;
        $n=0;
        while (strpos($str, '--') !== false && $n<$max) {
            $str = str_replace('--', '-', $str);
            $n++;
        }
        return $str;
    }


        function getPageByNameAndParent($identifier, $parent) {
            $identifier = $this->removeFileExt($identifier);
 
            $bits = explode('.', $identifier);
            $identifier = $bits[0];
            if (count($bits) > 1) {
                $_GET['params'] = array_slice($bits, 1);
            }
 
            if (empty($identifier)) {
                return $this->getDefaultPage();
            }
 
            $selectedPages = array();
            foreach ($this->pages as $page) {
                if (($this->normalize($page->name) == strtolower($identifier) || (strtolower($page->name)==$identifier))
                    && $page->parent == $parent)
                {
                    array_push($selectedPages, $page);
                }
            }
            return $selectedPages;
        }

(09/02/13)