メモ:trim toとencodeの組み合わせで気をつけること

  • Posted by: maRk
  • mt4
  • このエントリーを含むはてなブックマーク

Movable Typeのグローバル・モディファイアのtrim_toを使うとき、エンコードすべき文字の途中でトリムされる場合の検証と対処について

説明がわかりにくいと思うので、いきなりですが、やりたいことをテストテンプレートにて示します。

test template 1
<mt:setvars>data=0123456789&ABCDEF</mt:setvars>
<?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?>
<data><mt:var name="data" encode_xml="1" trim_to="11" /></data>

上に示したテンプレートでは、0から&(アンパサンド)までを指定して出力するものです。

このテンプレートをそのまま出力(XMLファイルとして)させてブラウザで見ると、パースエラーとなってるはずです。

では、trim_toの値を15にしてみるとどうでしょうか。これはエンコード後のアンパサンドの文字数を含める数値です。

test template 2
<mt:setvars>data=0123456789&ABCDEF</mt:setvars>
<?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?>
<data><mt:var name="data" encode_xml="1" trim_to="15" /></data>

今度は、モディファイアの順番をいれかえして、trim_toを先に記述してみます。

test template 3
<mt:setvars>data=0123456789&ABCDEF</mt:setvars>
<?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?>
<data><mt:var name="data" trim_to="11" encode_xml="1" /></data>

この場合だと、問題なく表示されます。

日本語の場合でテストしてみます。下のテンプレートではどうでしょうか。

test template 4
<mt:setvars>data=あいうえお&かきくけこ</mt:setvars>
<?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?>
<data><mt:var name="data" encode_xml="1" trim_to="9" /></data>

まとめのようなもの

以上のテンプレートは故意にエスケープすべき場所を指定してトリムをおこなっていますが、普通に記述していて予期しない箇所でパースエラーを引き起こす原因になっていることがありうるかも。

回避の方法としては、先にtrim_toを記述してから、encodeをおこなう形にするか、それが具合悪いのであれば、setvar、getvarで変数に渡してから処理するとか、XMLならば当該箇所をCDATAにするか、でしょうか。

それと、グローバル・モディファイアの処理を先に書いたものが先に実行されるらしいというかそういう仕様っぽいです。

Comments:

コメントをどうぞ。書き込む場所が不明な場合やサイトオーナーへのコンタクトは、GuestBookまでお気軽にどうぞ

blog comments powered by Disqus