如何将Unity游戏中的表情符号存储到数据库中?

时间:2019-05-22 18:25:49

标签: c# unity3d url encoding emoji

如何使用WWW类将TextMesh pro中的表情符号存储在数据库中,以将包含表情符号的字符串作为参数发布到URL中?

将Emoji表情从TextMesh Pro文本字段输入我的数据库时遇到问题。当我尝试时,表情符号数据将以纯文本格式存储,例如:ðŸ〜,或类似�或类似□取决于我尝试的编码。

我有一个使用sql语句将文本存储在mysql数据库中的php脚本。当我在浏览器中手动输入php脚本的网址并将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 :(得分:0)

将UTF-8编码的文本作为URL发送很容易出错,因为服务器在解码此类URL时会有截然不同的结果。 URL标准不能真正满足URL中的UTF-8(请参见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();
  }

此外,您还应该在这里重新考虑您的安全方案。您在此处使用没有随机数的哈希,因此每个持有您游戏ID的哈希的人都可以将该游戏的消息发布到您的服务器上,因为该哈希与攻击者的密码一样好。如果您将哈希作为MD5(gameId + text + secretKey)进行处理,则情况会好得多,因为攻击者无法发送带有被盗哈希的任意消息(尽管他仍然可以向您发送相同的消息,但是您却收到了理念)。

您也不应该将该哈希放入URL,该哈希将在HTTP服务器的访问日志文件中可见。为此使用Authorization标头。最后,您应该真正使用HTTPS来保护有效负载。