[Perl] XML::TreePP モジュール writefile 時の文字化け【解決】

XML::TreePP モジュールで、Perl オブジェクト→XML ファイル出力を行う
writefile() メソッドで文字化けが発生していました。
先週末にアップした、バージョン 0.31 で修正されています。
writefile() メソッドをご利用の方は、バージョンアップをお願いします。_o_
http://www.kawa.net/works/perl/treepp/treepp.html

原因は、utf8 フラグの扱い。
0.22 から、utf8_flag => 1 というオプションを追加したのだけど、
writefile 時の処理に問題が残っていました。
XML::TreePP モジュールの utf8 フラグ取り扱い方針は、以下の通り:

use utf8; あり + utf8_flag => 1   ⇒ utf8フラグを立ったまま出力
use utf8; あり + utf8_flag => undef ⇒ スルー(utf8フラグは立ったまま)
use utf8; なし + utf8_flag => 1   ⇒ utf8フラグを立てて出力
use utf8; なし + utf8_flag => undef ⇒ スルー(utf8フラグは立ってないまま)

writefile() メソッド自体は処理が短く、またファイル書き出しが伴う面倒もあり、
ちゃんとテストを組んでいなかったのが、バグの発見が遅れた原因。
追加しておきました。やっぱり、テスト大事ですね。申し訳ないです。。。
http://www.kawa.net/works/perl/treepp/temp/41_writefile_encode.t

#ただし、CPAN 上のパッケージには 41_writefile_encode.t は未同梱です。
#次回のバージョンアップ時に同梱しておきます。
みるふぃーゆさん、ご指摘ありがとうございました!



なお、このバージョン 0.31 では、合わせて、先週話題になっていた
CDATA セクション内に ]]> の件にも対応しています。

CDATA セクション中に ]]> という文字列を書きたい場合は、
<![CDATA[]]]]><![CDATA[>]]> または
<![CDATA[]]]><![CDATA[]>]]> と分割する必要がある。読みにくいけど。

0.31 以前でもこのような複数の CDATA で構成される要素を含む XML の読み込み処理には
対応していましたが、0.31 からは、書き出し処理にも対応しました。
書き出し時は、自動的に分割します。(こちらのテストは同梱してあります)

仕様書は、http://www.w3.org/TR/REC-xml/#sec-cdata-sectを参照:
[18]    CDSect       ::=     CDStart  CData  CDEnd
[19]    CDStart      ::=    '<![CDATA['
[20]    CData        ::=    (Char* - (Char* ']]>' Char*))
[21]    CDEnd        ::=    ']]>'

[39]    element      ::=     EmptyElemTag | STag content ETag 
[40]    STag         ::=    '<' Name (S  Attribute)* S? '>' 
[41]    Attribute    ::=     Name  Eq  AttValue  
[42]    ETag         ::=    '</' Name  S? '>'
[43]    content      ::=     CharData? ((element | Reference | CDSect | PI | Comment) CharData?)*
[44]    EmptyElemTag ::=    '<' Name (S  Attribute)* S? '/>'    

ポイントは、[20] で ']]>' が抜かれている点と、
[43] で CDSect が * なので、つまり要素中に CDATA が何回登場してもOKという点。
ふつうのテキスト、CDATA、コメントが何回混ざってもOKなんですね。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

2007年10月06日 12:50
快適なパソコンにしたいですね

この記事へのトラックバック