Кодировка Emoji в JSON, публикация на веб-сервере - PullRequest
4 голосов
/ 25 августа 2011

Пожалуйста, помогите мне с проблемой при отправке символа эмодзи в формате JSON.У меня есть UITextView, этот текстовый вид может иметь смайлики.Я отправляю данные на веб-сервер с UITextView.text, представленным как JSON, проблема в том, что когда у текста есть смайлики, я не могу получить данные.Что я делаю:

$postData = file_get_contents("php://input") to get the data.

, тогда я использую

$post = json_decode($postData,true);

для декодирования данных и получения массива и вставки данных в базу данных.

Вот фрагмент кода, когда я вставляю свои данные в базу данных.

$postData = file_get_contents("php://input");
//$postData = '{"body":"characters here ","subject":"subject here","username":"janus","from_id":"185","to_id":"62"}';
    $post = json_decode($postData,true);
        $data=array(
                'user_id_from'=>mysql_real_escape_string($post['from_id']),
                'user_id_to'=>mysql_real_escape_string($post['to_id']),
                'subject'=>mysql_real_escape_string($post['subject']),
                'message'=>mysql_real_escape_string($post['body']));

                $messages_obj->insert($data);

Без найденного символа смайликов он работает нормально.нет проблем.проблема в том, что при обнаружении символа смайлика данные в $ post (декодированные данные) равны нулю.

Я попытался использовать фиктивные данные (строка 2 в фрагменте кода)

//$postData = '{"body":"characters here ","subject":"subject here","username":"janus","from_id":"185","to_id":"62"}';

иЯ успешно вставил эмодзи в базу данных.Я не знаю почему, но он не работает так же, когда данные поступают с устройства ($ postData = file_get_contents ("php: // input"))

Так я кодирую и публикую свои данные в клиенте.

    NSMutableDictionary *messageDetails = [[NSMutableDictionary alloc] init];
[messageDetails setObject:[loginItems objectForKey:@"user_id"] forKey:@"from_id"];
[messageDetails setObject:recipientID forKey:@"to_id"];
[messageDetails setObject:@"subject here" forKey:@"subject"];
[messageDetails setObject:newMessageField.text forKey:@"body"];
    [messageDetails setObject:[loginItems objectForKey:@"username"] forKey:@"username"];


NSString *strPostData = [messageDetails JSONRepresentation];
[messageDetails release];

NSData *postData = [NSData dataWithBytes:[strPostData   UTF8String] length:[strPostData  length]];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:postData];

Кстати, кто создал эти символы эмодзи?Он разрушает мою жизнь!

Ответы [ 3 ]

4 голосов
/ 07 сентября 2011

Как только данные отправлены в ваш php-скрипт, вам нужно преобразовать их в многобайтовую строку:

$content = mb_convert_encoding($content, 'UTF-8');

Вы можете использовать эту функцию:

function cb($content){

  if(!mb_check_encoding($content, 'UTF-8')
   OR !($content === mb_convert_encoding(mb_convert_encoding($content, 'UTF-32', 'UTF-8' ), 'UTF-8', 'UTF-32'))) {

    $content = mb_convert_encoding($content, 'UTF-8');

  }
  return $content;
}

Редактировать: данныевероятно, для нас был тип application / x-www-form-urlencoded, и эта функция преобразовала его правильно.

1 голос
/ 14 мая 2013

Пожалуйста, выполните следующие действия:

  • Преобразование символов эмодзи в base64 и отправка на сервер.
  • На стороне сервера сохраняйте base64 в базе данных без декодирования.
  • КогдаВы хотите отобразить Emoji в приложении, а затем получить те же данные base64 с сервера.
  • Декодировать, получить строку и отобразить в приложении.
  • Ваш символ Emoji будет отображаться правильно.
1 голос
/ 25 августа 2011

символов смайликов, скорее всего, перекодируются в UNICODE, поэтому должно быть достаточно просто отправлять, получать и управлять своими данными в UTF-8.

При получении с этим

$postData = file_get_contents("php://input") 

(Я полагаю, это реальный URL), убедитесь, что ваш php-скрипт отправляет заголовок Content-Encoding (как показано ниже, выберите MIME-тип, который вам подходит)

 header("Content-Type: text/html; charset=utf-8");
...