草庐IT

php - 终极表情符号编码方案

coder 2023-10-02 原文

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

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

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

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

我的问题如下:

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

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

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

现在我有带 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 以上的任何字符。通过 MySQL 一直使用 utf8mb4

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"');
?

关于php - 终极表情符号编码方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34637105/

有关php - 终极表情符号编码方案的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  3. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  4. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  5. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  6. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  7. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  8. ruby - 如果它是标点符号,我怎么能从字符串中删除最后一个字符,在 ruby​​ 中? - 2

    啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组

  9. ruby - 如何在 Ruby 字符串中插入项目符号字符? - 2

    我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195

  10. c - Ruby - 源代码 - 编码风格 - 2

    查看Ruby代码,它具有以下proc_arity:staticVALUEproc_arity(VALUEself){intarity=rb_proc_arity(self);returnINT2FIX(arity);}更多的是C编码风格问题,但为什么staticVALUE在单独的一行而不是像这样的:staticVALUEproc_arity(VALUEself) 最佳答案 它来自UNIX世界,因为它有助于轻松grep函数的定义:$grep-n'^proc_arity'*.c或使用vim:/^proc_arity

随机推荐