【问题标题】:How can I store emoji from my Unity game into a database?如何将 Unity 游戏中的表情符号存储到数据库中?
【发布时间】:2019-10-09 07:11:15
【问题描述】:

如何使用 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); 


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

感谢您的宝贵时间。

【问题讨论】:

  • 您能否澄清帖子中显示的那个奇怪代码的目的(将 UTF8 字节作为其他编码读取)?不完全确定这与您的问题有何关系...
  • @Machavity 该副本不适用于此处,因为他们已经声明 PHP 和 MySQL 方面的工作正常。 Magnus,我建议您修改您的问题以专注于 C#。如果 PHP 工作正常,则无需在问题中对其进行标记。提供更多 C# 代码,包括 minimal reproducible example
  • 这是一个有趣的编辑——你声称“所以问题不在于我的 MySQL 数据库,也不在于我的 PHP。”然而你已经删除了 C#...所以你能澄清一下你有问题吗?考虑edit您的帖子,以确认您可以使用硬编码值查看您想要的任何内容并显示数据(最好以字节为单位)和您尝试过的实际代码......
  • 删除 c# 标签是一个错误。我现在做了另一个编辑。我不确定要包含哪些代码。另外我对编码的了解很少,所以当我不知道问题是什么时,我很难理解问题。我知道这没有帮助......
  • 你是如何将表情符号放入 textmesh pro 中的?

标签: c# unity3d url encoding emoji


【解决方案1】:

将 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 来保护有效负载。

【讨论】:

  • 就是这样。现在一切正常。我知道这与 url 中的编码有关。我不敢相信我一直在寻找答案的这个问题实际上只是归结为获取与发布请求。我应该更多地关注我的网络课程。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多