У меня есть асинхронный веб-сервис, в котором пользователи мобильного приложения могут оставлять комментарии на своем телефоне, он использует 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, так что, должно быть, что-то происходит по пути.