Как я могу хранить смайлики из моей игры Unity в базе данных? - PullRequest
0 голосов
/ 22 мая 2019

Как я могу хранить смайлики из TextMesh pro в базе данных, используя класс WWW, чтобы опубликовать строку, содержащую смайлики, в качестве параметра в URL?

У меня проблема с переносом эмодзи из текстового поля TextMesh Pro в мою базу данных. Когда я пытаюсь, данные смайликов сохраняются в виде обычного текста, например: ŸŸ˜ ‚или как этот или как этот □ в зависимости от того, какую кодировку я пробую.

У меня есть php-скрипт, который использует оператор sql для хранения текста в моей базе данных mysql. И когда я вручную набираю URL скрипта php в своем браузере и добавляю emoji в качестве параметра , он прекрасно работает , он правильно хранит emoji (так как я уже установил параметры сортировки в моей базе данных utf8mb4 ).

Вот часть, которую я не понимаю: если я возьму строку, содержащую эмодзи, через мой код на c # и получу доступ к файлу php со строкой в ​​качестве параметра, это не сработает. Он хранит смайлики как mojibake . (‚Ÿ‚ эта последовательность символов должна быть такой: ?).

В противном случае он прекрасно сохраняет текст, поэтому с кодом ниже проблем нет. Вот как это выглядит:

public IEnumerator UpdateChatCR(string gameID, string text)
{
    string hash = Md5Sum(gameID + secretKey);

    print("posting to chat db: " + text);

    string post_url = updateChatURL + "&game_id=" + gameID + "&text=" + text + "&hash=" + hash;
    WWW www = new WWW("http://" + post_url);
    yield return www;

    if (www.error != null)
    {
        print("There was an error updating the chat in the DB: " + www.error);
    }
    else
    {
        //print(www.text);
    }
}


Я пробовал разные способы кодирования текста, но, честно говоря, я понятия не имею, что я делаю в данный момент. Я пробовал разные варианты следующего кода, но безуспешно:

byte[] bytes = Encoding.UTF8.GetBytes(tmpField.text);
string encodedText = Encoding.Default.GetString(bytes); 


Я искал ответ в течение последних нескольких дней. И я дошел до того, что понял, что мне, вероятно, придется читать книгу о кодировании и смайликах, если только не найдется кто-то, кто сможет мне помочь ...

Спасибо за ваше время.

1 Ответ

0 голосов
/ 23 мая 2019

Отправка текста в кодировке UTF-8 как части URL-адреса подвержена ошибкам, поскольку серверы имеют совершенно разные результаты при декодировании таких URL-адресов. Стандарт URL-адреса на самом деле не учитывает UTF-8 в URL-адресах (см. https://stackoverflow.com/a/1020299/511362), поэтому лучше будет отправлять текст в виде запроса HTTP POST.

  WWWForm form = new WWWForm();
 form.AddField("text", text);

  using (UnityWebRequest www = UnityWebRequest.Post("http://www.my-server.com/myform", form))
  {
     yield return www.SendWebRequest();
  }

Также вам следует переосмыслить вашу схему безопасности здесь. Здесь вы используете хэш без одноразового номера, поэтому каждый, кто получит этот хэш для вашего идентификатора игры, сможет публиковать сообщения для этой игры на ваш сервер, потому что этот хэш так же хорош, как и пароль для злоумышленника. Если бы вы использовали хэш в качестве MD5 (gameId + text + secretKey), вам было бы намного лучше, поскольку злоумышленник не мог отправлять произвольные сообщения с украденным хешем (хотя он все еще может спамить вас тем же сообщением, но вы получите идея).

Вы также не должны помещать этот хеш в URL, где он будет виден в файлах журнала доступа вашего HTTP-сервера. Для этого используйте заголовок Authorization. Наконец, вы действительно должны использовать HTTPS для защиты полезной нагрузки.

...