最终的表情符号编码方案

时间:2016-01-06 15:45:00

标签: php mysql json utf-8 utf8mb4

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

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

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

我想添加对emojis或任何utf8mb4字符的支持。我正在寻找在我的方案中处理这个问题的正确方法。

我的问题如下:

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

  2. 如果我的数据库有整理和字符集utf8mb4,这是否意味着我应该能够存储'原始'表情符号?

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

  4. 现在我的数据库是utf8mb4,但在尝试存储原始表情符号时出错。另一方面,我可以存储非utf8符号,例如¿á

    当我在PHP中检索这个符号时,我首先需要执行SET CHARACTER SET utf8(如果我在utf8mb4中得到它们json_decode函数不起作用),那么这些符号就会被编码(例如,{{ 1}}被编码为¿)。

2 个答案:

答案 0 :(得分:10)

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,这是否意味着我应该能够存储'raw'emojis?

  

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

上帝不,使用原始的UTF-8(utf8mb4)来表达所有神圣的东西。

  

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

嗯,这是你的问题;通过MySQL utf8字符集引导数据将丢弃U + FFFF以上的任何字符。在MySQL中一直使用utf8mb4

  

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

你必须明确指出这意味着什么。 PHP的JSON函数应该能够正常处理任何Unicode代码点,只要它是有效的UTF-8:

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

echo json_decode('"\ud83d\ude00"');

答案 1 :(得分:2)

在整个MySQL中使用utf8mb4:

  • SET NAMES utf8mb4
  • 声明表格/列CHARACTER SET utf8mb4
  • 表情符号和某些中文字符可以在utf8mb4中使用,但不能在MySQL的utf8中使用。

在其他方面使用UTF-8:

  • HTML:

¿á是(或至少可以)以utf8编码(utf8mb4)