终极表情符号编码方案

The ultimate emoji encoding scheme

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

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

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

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

我的问题如下:

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

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

  3. 我应该尝试使用 utf8mb4 在数据库中工作还是 safer/better/more 支持在 utf8 中工作并对符号进行编码?如果是这样,我应该使用哪种编码方法才能使其在 Objective-C 和 PHP(以及 java 用于未来的 android 版本)中完美运行?

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

当我在 PHP 中检索这个符号时,我首先需要执行 SET CHARACTER SET utf8 (如果我在 utf8mb4 中得到它们, json_decode 函数不起作用),那么这样的符号是编码(例如,¿ 编码为 \u00bf)。

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

Does POST allow utf8mb4, or should I convert the data in the client to plain utf8?

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

If my DB has collation and character set utf8mb4, does it mean I should be able to store 'raw' emojis?

是的。

Should I try to work in the DB with utf8mb4 or is it safer/better/more supported to work in utf8 and encode symbols?

上帝啊,不,对所有神圣的东西都使用原始 UTF-8 (utf8mb4)。

When I retrieve this symbols in PHP I first need to execute SET CHARACTER SET utf8

嗯,这是你的问题;通过 MySQL 的 utf8 字符集传输数据将丢弃 U+FFFF 以上的所有字符。使用 utf8mb4 一直到 MySQL.

if I get them in utf8mb4 the json_decode function doesn't work

您必须具体说明它的确切含义。 PHP 的 JSON 函数应该能够很好地处理任何 Unicode 代码点,只要它是有效的 UTF-8:

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

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

始终使用 utf8mb4 MySQL:

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

在其他地方使用 UTF-8:

  • HTML:

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