2012-01-06 16 views
1

我有一個異步Web服務,其中移動應用的用戶可以在手機上發表評論,它使用JSON上傳後的API和服務器進入後進入數據庫,發送一個確認回設備。服務器使用XML-RPC傳遞消息,但與設備的所有通信均由JSON完成。處理中國文字與XML-RPC和MySQL

我現在正在努力增加對中國字符的支持。當我發表的帖子從設備,這是當它被送到了JSON文本的外觀:

Request object: 

(
    { 
     comment = "\U4e2d\U56fd"; 
     "post_id" = 119791544; 
    } 
) 

這番話值代表了兩個中國字中國。當它被輸入到數據庫中時,它會以「??」的形式出現。看着這個十六進制值,它轉換爲3F3F,所以數據庫絕對只是存儲問號而不是在顯示字符時遇到麻煩。 。另外這意味着服務器明白,只有兩個字符來過,所以它認識到什麼是未來的字符大小這是函數當服務器接收來自設備的數據被稱爲:

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數據庫,以便它必須有一些在路上破天。

回答

0

無論你的MySQL連接和表字段整理必須支持中國文字。 UTF unicode連接是一個不錯的選擇。

例如,做出mysql_set_charset("utf8", $link)調用設置爲UTF8連接你打電話後立即mysql_connect();

+0

謝謝你的提示,儘管所有的MySQL的東西是在post_comment功能,因此不會影響$ c ['comment']的值 - 因此錯誤必須在此之前。 – benwad 2012-01-06 10:46:18

+0

哦,那麼是否正確設置了用於XML-RPC POST通信的字符集?如果我是對的,那麼發佈到數據庫的內容已經變成亂碼了。您可以將內容正確地記錄到您放置@todo的位置,以查看您的內容是否已正確傳送到您的腳本。如果正在記錄的內容是正確的,那麼你的數據庫連接出錯。 – 2012-01-06 10:58:02

+0

我已經把日誌功能,其中@todo是,它只是記錄了兩個問號,所以必須的東西之前發生。這可能是與實際的PHP文件的編碼有關嗎? – benwad 2012-01-06 14:02:38