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

How can I store emoji from my Unity game into a database?

如何使用 WWW class 将包含表情符号的字符串作为 URL 中的参数 post 将来自 TextMesh pro 的表情符号存储在数据库中?

我在将表情符号从 TextMesh Pro 文本字段获取到我的数据库时遇到问题。当我尝试时,表情符号数据以纯文本形式存储,如下所示:ðŸ〜‚ 或像这样 � 或像这样 □,具体取决于我尝试的编码方式。

我有一个 php 脚本,它使用 sql 语句将文本存储在我的 mysql 数据库中。当我在浏览器中手动输入 php 脚本的 url 并将表情符号添加为参数时 它工作得很好 ,它正确地存储了表情符号 (因为我已经将数据库的排序规则设置为 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); 


最近几天我一直在寻找答案。我已经到了意识到我可能必须阅读一本关于编码和表情符号的书的地步,除非有人可以帮助我......

谢谢你的时间。

将 UTF-8 编码的文本作为 URL 的一部分发送很容易出错,因为服务器在解码此类 URL 时会产生截然不同的结果。 URL 标准并不能真正满足 URLS 中的 UTF-8(请参阅 https://whosebug.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();
  }

此外,您应该重新考虑您的安全方案。您在这里使用不带随机数的哈希值,这样每个获得您的 game-id 哈希值的人都能够 post 该游戏的消息发送到您的服务器,因为该哈希值与密码一样好攻击者。如果你将散列作为 MD5(gameId+text+secretKey) 你会好很多,因为攻击者无法发送带有被盗散列的任意消息(他仍然可以用相同的消息向你发送垃圾邮件,但你得到主意)。

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