首页 > 解决方案 > 如何将 Unity 游戏中的表情符号存储到数据库中?

问题描述

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

我在将表情符号从 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); 


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

谢谢你的时间。

标签: c#unity3durlencodingemoji

解决方案


将 UTF-8 编码文本作为 URL 的一部分发送很容易出错,因为服务器在解码此类 URL 时会产生截然不同的结果。URL 标准并不能真正满足 URLS 中的 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) 进行处理,您的情况会好很多,因为攻击者无法发送带有被盗哈希的任意消息(尽管他仍然可以使用相同的消息向您发送垃圾邮件,但您会得到主意)。

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


推荐阅读