c# - 如何将 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);
这几天我一直在寻找答案。我已经到了这样的地步,我意识到我可能必须阅读一本关于编码和表情符号的书,除非有人可以帮助我......
谢谢你的时间。
解决方案
将 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 来保护有效负载。
推荐阅读
- spring - 如何在 Spring JPA 中防止并发实体创建
- go - 是否可以在 Golang 中为动态创建的结构(使用反射)提供名称
- c# - C# Entity Framework:GrandChildren 上的 Linq 过滤器并在父级上进行选择
- php - 如何修复 Laravel 7 中的 Laravel Mix 构建错误
- php - 图片来自api数据时是否可以创建图片下载链接?
- google-visualization - 谷歌饼图每个元素的固定颜色
- python-3.x - plt.hlines 一起绘制时显示不正确的结果
- google-apps-script - 谷歌幻灯片元素选择顺序问题
- javascript - Cypress.io cy.request() 将正文作为 var 传递
- multithreading - 为什么`Rc`线程是不安全的?