モバイルアプリのユーザーが携帯電話にコメントを投稿し、JSONを使用してAPIに投稿をアップロードし、サーバーが投稿に入力する非同期Webサービスがあります確認をデバイスに返信する。サーバーはXML-RPCを使用してメッセージを渡しますが、デバイスとのすべての通信はJSONによって行われます。XML-RPCとMySQLで漢字を扱う
現在、漢字のサポートを追加しようとしています。私は、デバイスからのポストを作成すると、これは、それが送信されたときにJSONテキストがどのように見えるかです:
Request object:
(
{
comment = "\U4e2d\U56fd";
"post_id" = 119791544;
}
)
値をコメントすること中国2つの中国の文字を表します。これがデータベースに入力されると、 "??"と表示されます。 16進値を見ると3F3Fに変換されるので、文字列を表示するのに問題があるのではなく、クエスチョンマークをデータベースに保存するだけです。また、これはこれは、サーバがデバイスからデータを受信したときに呼び出される関数である、それは入ってくる何の文字サイズを認識するように、サーバーは、2文字のみが通過来ていることを理解していることを意味します
function server_impl_post_comment($m)
{
global $xmlrpcerruser;
$auth = server_utils_authenticate_client();
// return error if client is not authorised to use the api
if (!$auth['result'])
{
return new xmlrpcresp(0, $xmlrpcerruser, $auth['reason']);
}
logger_api_log_method_call('ff.post_comment', $auth['user_id']);
$args = $m->getParam(0);
$c['user_id'] = $auth['user_id'];
$c['post_id'] = $args->structmem("post_id")->scalarval();
$c['comment'] = $args->structmem("comment")->scalarval();
// @todo: chinese characters come through as ? here
// submit the comment
$comment = post_comment($c);
$post = post_get_post($c['post_id']);
$result = server_utils_format_result_struct(TRUE, POST_COMMENT_TITLE, POST_COMMENT_MSG, POST_COMMENT_BUTTON, POST_COMMENT_SHOW, $c['post_id'], $comment);
$result['post_info'] = server_utils_format_post_info($post);
$result['post_up_votes'] = $post['post_vote_up_count'];
$result['post_down_votes'] = $post['post_vote_down_count'];
$result['post_comments'] = $post['post_comment_count'];
return new xmlrpcresp(php_xmlrpc_encode($result));
}
@todoのコメント行で、私はロギングメソッドを追加し、$ c ['comment']は "??"再び。私は最初に$ mの値を記録しようとしましたが、それは何らかの理由で動作しませんでした。サーバー上で使用されているXML-RPCライブラリは、Edd Dumbillのxmlrpc.inc v1.169です。私が知る限り、これはUTF-8をサポートしています。これはどこに間違っているかについての任意のアイデア?私はSQLでデータベースにまっすぐに中国語を挿入できました。
感謝を呼び出した直後にUTF8への接続を設定するための
mysql_set_charset("utf8", $link)
に電話をかけます$ c ['comment']の値です。その前にエラーがなければなりません。 – benwadXML-RPCのPOST通信の文字セットが正しく設定されていますか?もし私が正しいのであれば、データベースに投稿されているコンテンツはすでに歪んでいます。 @todoを置いた場所でコンテンツをログに記録して、コンテンツがスクリプトに正しく配信されているかどうかを確認できます。ログに記録されている内容が正しい場合は、データベース接続に問題があります。 –
私は@todoがあり、2つの疑問符を記録したところでログ機能を付けました。その前に何かが起こっているはずです。それは実際のPHPファイルのエンコーディングと関係がありますか? – benwad