Paradigm Shift Design

ISHITOYA Kentaro's blog.

PHPでjson_encodeした文字列をC#でデコードするときの注意事項

ちょっとはまったのでメモします。
PHP側で例えば

<?php
class Bean{
  public $str = "もげほげ";
};
echo json_encode(new Bean());
?>

とする*1


で、これをC#側で、

String postdata = "tokuninashi";
HttpWebRequest request =
(HttpWebRequest)WebRequest.Create(@"http://example.com/api/");
request.Method = "POST";
request.Headers.Add(HttpRequestHeader.Pragma.ToString(), "no-cache");
request.Headers.Add(HttpRequestHeader.ContentEncoding, "UTF-8");

Byte[] postbytes = Encoding.UTF8.GetBytes(postdata);
request.ContentLength = postbytes.Length;

Stream stream = request.GetRequestStream();
stream.Write(postbytes, 0, postbytes.Length);

//本題はここから
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
String result = new StreamReader(response.GetResponseStream()).ReadToEnd();
Console.WriteLine(result);

とすると、出力は

{"str":"\u3082\u3052\u307b\u3052"}"

となる*2

んで、これUTF-8の文字列がURLエンコードされているのだけれども、単純に

result = System.Web.HttpUtility.UrlDecode(result);

とだけしても、だめで、前処理として円記号をパーセント記号に変換してあげる必要があって、

result = result.Replace(@"\", @"%");
result = System.Web.HttpUtility.UrlDecode(result);

としないとだめ。
少しばかりはまった。

*1:Content-Typeとかの出力は端折ってます

*2:PHPの出力文字コードUTF-8とする