Ticket #25702

WordPress の記事投稿時カテゴリ設定に Movable Type と同じ方式を採用しようとしたが失敗した。

Open Date: 2011-07-14 21:34 Last Update: 2011-07-16 11:28

Reporter:
Owner:
Type:
Status:
Closed
Component:
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
Fixed
File:
None

Details

Movable Type では mt.getCategoryList でカテゴリの一覧を取得し、mt.setPostCategories で記事へのカテゴリ設定を行うという方法を採った。

同じ方法を WordPress に転用できないかと試したところ以下のような例外が発生し、正常に機能しないことがわかった。

E, [2011-07-14T19:56:16.551099 #5660] ERROR -- : #<Encoding::CompatibilityError: incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string)>
../Ruby192/lib/ruby/1.9.1/rexml/source.rb:212:in `match'
../Ruby192/lib/ruby/1.9.1/rexml/source.rb:212:in `match'
../Ruby192/lib/ruby/1.9.1/rexml/parsers/baseparser.rb:425:in `pull'
../Ruby192/lib/ruby/1.9.1/rexml/parsers/streamparser.rb:16:in `parse'
../Ruby192/lib/ruby/1.9.1/rexml/document.rb:204:in `parse_stream'
../Ruby192/lib/ruby/1.9.1/xmlrpc/parser.rb:718:in `parse'
../Ruby192/lib/ruby/1.9.1/xmlrpc/parser.rb:460:in `parseMethodResponse'
../Ruby192/lib/ruby/1.9.1/xmlrpc/client.rb:421:in `call2'
../Ruby192/lib/ruby/1.9.1/xmlrpc/client.rb:410:in `call'
../mail2weblog/main/plugin/weblog/mt/mt_post_extension.rb:33:in `set_post_categories'
../mail2weblog/main/plugin/weblog/mt/mt_post_extension.rb:25:in `post_after'
../mail2weblog/main/plugin/weblog/metaweblog/metaweblog_post_extension.rb:76:in `post'
../mail2weblog/main/plugin/command/weblog_post_command.rb:31:in `run'
../mail2weblog/main/lib/weblog_command.rb:61:in `run'
../mail2weblog/main/lib/mui/mail_command_processor.rb:50:in `block in run'
../Ruby192/lib/ruby/1.9.1/net/pop.rb:645:in `each'
../Ruby192/lib/ruby/1.9.1/net/pop.rb:645:in `each_mail'
../mail2weblog/main/lib/mui/mail_command_processor.rb:47:in `run'
m2w.rb:30:in `<main>'
...
Exception parsing
Line: 9
Position: 284
Last 80 unconsumed characters:
カテゴリ1</string> (REXML::ParseException)
../Ruby192/lib/ruby/1.9.1/rexml/parsers/baseparser.rb:441:in `rescue in pull'
../Ruby192/lib/ruby/1.9.1/rexml/parsers/baseparser.rb:332:in `pull'
../Ruby192/lib/ruby/1.9.1/rexml/parsers/streamparser.rb:16:in `parse'
../Ruby192/lib/ruby/1.9.1/rexml/document.rb:204:in `parse_stream'
../Ruby192/lib/ruby/1.9.1/xmlrpc/parser.rb:718:in `parse'
../Ruby192/lib/ruby/1.9.1/xmlrpc/parser.rb:460:in `parseMethodResponse'
../Ruby192/lib/ruby/1.9.1/xmlrpc/client.rb:421:in `call2'
../Ruby192/lib/ruby/1.9.1/xmlrpc/client.rb:410:in `call'
../mail2weblog/main/plugin/weblog/mt/mt_post_extension.rb:33:in `set_post_categories'
../mail2weblog/main/plugin/weblog/mt/mt_post_extension.rb:25:in `post_after'
../mail2weblog/main/plugin/weblog/metaweblog/metaweblog_post_extension.rb:76:in `post'
../mail2weblog/main/plugin/command/weblog_post_command.rb:31:in `run'
../mail2weblog/main/lib/weblog_command.rb:61:in `run'
../mail2weblog/main/lib/mui/mail_command_processor.rb:50:in `block in run'
../Ruby192/lib/ruby/1.9.1/net/pop.rb:645:in `each'
../Ruby192/lib/ruby/1.9.1/net/pop.rb:645:in `each_mail'
../mail2weblog/main/lib/mui/mail_command_processor.rb:47:in `run'

Ticket History (3/3 Histories)

2011-07-14 21:34 Updated by: toy_dev
  • New Ticket "WordPress の記事投稿時カテゴリ設定に Movable Type と同じ方式を採用しようとしたが失敗した。" created
2011-07-14 22:00 Updated by: toy_dev
Comment

本問題についてわかっていることを列挙する。

  • WordPress が返す XML-RPC のレスポンスには encoding 指定がない。
    • <?xml version="1.0"?> となっている。
    • カテゴリに日本語入っていた場合、実質的には UTF-8 でレスポンスが返ってくる。
    • したがって、理想的には <?xml version="1.0" encoding="UTF-8"?> という形で encoding 指定付きのレスポンスが来て欲しい。
  • Ruby の xmlrpc モジュール は内部で rexml モジュールを使いレスポンスとしてきた XML ドキュメントの解読を行っている。
  • Ruby の rexml モジュールは、内部で XML ドキュメントの encoding 指定を見ており、内部では文字列を UTF-8 に統一して処理をしようとする。
    • ただし、WordPress が返すレスポンスのような XML ドキュメントの場合は encoding 指定がないため XML ドキュメントの文字列を ASCII-8BIT として処理しようとする。
    • 実際に日本語文字列などの非 ASCII 文字列が入ってこなければ問題は発生しない。
    • 例外として日本語文字列などの非 ASCII 文字列が入ってきてしまった場合に、問題の例外が発生する。
    • 本問題は M18N に起因して発生するため Ruby 1.9 では問題が発生するが Ruby 1.8 では問題が発生しない。

本問題は以下の条件が揃ったときに発生する一般的な問題のようだ。

  • Ruby 1.9 以上を使う。
  • xmlrpc モジュールを使って XML-RPC を処理する。
  • XML-RPC のレスポンスに encoding 指定が来ない。
  • XML-RPC のレスポンスに非 ASCII 文字列が存在する。
2011-07-16 11:28 Updated by: toy_dev
  • Resolution Update from None to Fixed
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2011-07-16 11:28
Comment

XML ドキュメントを解析する前に、対象の XML ドキュメントの encoding 指定の有無を確認し、encoding 指定がなければ強制的に入れるパーサを追加することで対処した。

詳細な対処方法に着いては、以下のページにまとめた。

- XMLRPC::Client で CompatibilityError が発生した場合の対処方法について

Attachment File List

No attachments

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login