终极表情符号编码方案
The ultimate emoji encoding scheme
这是我的环境:客户端 -> iOS 应用程序,服务器 -> PHP 和 MySQL。
从客户端到服务器的数据是通过 HTTP POST.
从服务器到客户端的数据是用json完成的。
我想添加对表情符号或一般任何 utf8mb4 字符的支持。我正在寻找在我的情况下处理这个问题的正确方法。
我的问题如下:
POST是否允许 utf8mb4,或者我应该将客户端中的数据转换为纯 utf8?
如果我的数据库有排序规则和字符集 utf8mb4,是否意味着我应该能够存储 'raw' 表情符号?
我应该尝试使用 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)
这是我的环境:客户端 -> iOS 应用程序,服务器 -> PHP 和 MySQL。
从客户端到服务器的数据是通过 HTTP POST.
从服务器到客户端的数据是用json完成的。
我想添加对表情符号或一般任何 utf8mb4 字符的支持。我正在寻找在我的情况下处理这个问题的正确方法。
我的问题如下:
POST是否允许 utf8mb4,或者我应该将客户端中的数据转换为纯 utf8?
如果我的数据库有排序规则和字符集 utf8mb4,是否意味着我应该能够存储 'raw' 表情符号?
我应该尝试使用 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)