Обработка китайских символов с помощью XML-RPC и MySQL - PullRequest
1 голос
/ 06 января 2012

У меня есть асинхронный веб-сервис, в котором пользователи мобильного приложения могут оставлять комментарии на своем телефоне, он использует JSON для загрузки сообщения в API, а сервер вводит сообщение в базу данных, отправляя подтверждение обратноУстройство.Сервер использует XML-RPC для передачи сообщений, но вся связь с устройством осуществляется с помощью JSON.

Я сейчас пытаюсь добавить поддержку китайских символов.Когда я создаю сообщение с устройства, вот как выглядит текст 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 xmlrpc.inc v1.169 от Edd Dumbill, и, насколько я знаю, она поддерживает UTF-8.Любые идеи относительно того, где это идет не так?Я смог вставить китайские иероглифы прямо в базу данных с помощью SQL, так что, должно быть, что-то происходит по пути.

1 Ответ

0 голосов
/ 06 января 2012

И ваше соединение MySQL, и сопоставление полей таблицы должны поддерживать китайские символы.Юникодные соединения UTF - хорошая ставка.

Например, позвоните на mysql_set_charset("utf8", $link), чтобы установить соединение на UTF8 сразу после того, как вы позвоните mysql_connect();

...