tohokuaikiのチラシの裏

技術的ネタとか。

PEARのXML_RPC2が文字化けする件

WordPressAPIをたたいてて困った。投稿するとどうしても文字化けする。

んー、って思って、XML_RPC2をデバッグモードにしてみた。すると

     <value>
      <string>API&#227;&#131;&#170;&#227;&#13.......;&#154;&#227;&#131;&#188;&#227;&#130;&#184;</string>
     </value>

みたいな感じなXMLを投げてた。


あれ〜どこで実体参照に変更してるんだ?って思って追いかけて見つけたのがここ
pear/XML/RPC2/Backend/Xmlrpcext/Client.php

<?php
    public function remoteCall___($methodName, $parameters)
    {
        $tmp = xmlrpc_encode_request($this->prefix . $methodName, $parameters, array('encoding' => $this->encoding));


なんだ、このxmlrpc_encode_requestって思って早速PHPマニュアル見た。

すると、なんだこれ、iconv使ってるんだ。iconvの設定は・・・・

ありゃ、見事にISO-8859-1だわって思って、iconv_set_encoding('internal_encoding', 'UTF-8');ってしてやった。でも、ダメ直らない・・・。

んーって思ってxmlrpc_encode_request関数のマニュアル見たら

06-Feb-2008 10:05
It should be noted that encoding does not seem to encode anything, just specify what goes into the XML header.

We had problems with double-encoded UTF strings being saved to database when using this function, sending it of to a apache xml-rpc servlet and storing it in mysql database. It was solved by setting 'escaping' to just 'markup' and 'encoding' to 'UTF-8' (don't forget to set 'utf-8' in xmlrpc_decode too).

It seems that UTF-8 encoded strings gets escaped with their bytes as entities instead of their characters as entites.

おんなじような感じで困ってる人がいた。

どうやら、オプションにescaping => markupを付ければ良いみたい。ということで、

<?php
    public function remoteCall___($methodName, $parameters)
    {
        $tmp = xmlrpc_encode_request($this->prefix . $methodName, $parameters, array('escaping'=> "markup", 'encoding' => $this->encoding));

な形にしたらOKだった。