一尘不染

最终的表情符号编码方案

mysql

这是我的环境:客户端-> iOS应用程序,服务器-> PHP和MySQL。

从客户端到服务器的数据是通过HTTP POST完成的。

从服务器到客户端的数据是使用json完成的。

我想增加对表情符号或任何utf8mb4字符的支持。我正在寻找在我的情况下处理此问题的正确方法。

我的问题如下:

  1. POST是否允许utf8mb4,还是应该将客户端中的数据转换为纯utf8?

  2. 如果我的数据库具有排序规则和字符集utf8mb4,这是否意味着我应该能够存储“原始”表情符号?

  3. 我应该尝试使用utf8mb4在数据库中工作还是在utf8中工作和对符号进行编码更安全/更好/更受支持?如果是这样,我应该使用哪种编码方法,以便它在Objective-C和PHP(以及未来的android版本的java)中都可以正常工作?

现在,我拥有带utf8mb4的数据库,但是尝试存储原始表情符号时出现错误。在另一方面,我可以存储非UTF8符号,¿á

当我在PHP中检索此符号时,我首先需要执行SET CHARACTER SET utf8(如果我在utf8mb4中将其获取,则该json_decode功能将不起作用),然后将这些符号编码(例如,¿编码为\u00bf)。


阅读 657

收藏
2020-05-17

共1个答案

一尘不染

MySQL的utf8字符集 实际上不是UTF-8 ,它 是UTF-8 的子集,仅支持基本平面(字符最多为U +
FFFF)。大多数表情符号使用的代码点高于U + FFFF。MySQL utf8mb4实际的UTF-8
,可以对所有这些代码点进行编码。在MySQL之外,没有“ utf8mb4”之类的东西,只有UTF-8。所以:

POST是否允许utf8mb4,还是应该将客户端中的数据转换为纯utf8?

同样,没有“ utf8mb4”这样的东西。HTTP POST请求支持任何原始字节,如果您的客户端发送UTF-8编码的数据,就可以了。

如果我的数据库具有排序规则和字符集utf8mb4,这是否意味着我应该能够存储“原始”表情符号?

是。

我应该尝试使用utf8mb4在数据库中工作还是在utf8中工作和对符号进行编码更安全/更好/更受支持?

天哪,utf8mb4对所有神圣的东西都使用原始的UTF-8()。

当我在PHP中检索此符号时,我首先需要执行 SET CHARACTER SET utf8

好吧,那是你的问题;通过MySQL的utf8字符集引导数据将丢弃U + FFFF以上的任何字符。用utf8mb4所有的方式通过的MySQL。

如果我在utf8mb4中获取它们,则json_decode函数不起作用

您必须指定确切的含义。只要它是有效的UTF-8,PHP的JSON函数就应该能够处理任何Unicode代码点:

echo json_encode('😀');
"\ud83d\ude00"

echo json_decode('"\ud83d\ude00"');
😀
2020-05-17