kyubotics / coolq-http-api

为 酷Q 提供通过 HTTP 或 WebSocket 接收事件和调用 API 的能力
https://cqhttp.cc/docs/
GNU General Public License v3.0
1.85k stars 308 forks source link

Emoji 的转换和解析问题 #47

Closed stdrc closed 6 years ago

stdrc commented 6 years ago

目前的测试和用户反馈发现,正常的单码位 emoji(一个 Unicode codepoint,也即一个 char32_t 可以表示的字符)是可以正常在 CQ 码和 Unicode 之间互转的。

http://www.unicode.org/Public/emoji/11.0/emoji-sequences.txthttp://www.unicode.org/Public/emoji/11.0/emoji-variation-sequences.txt 中,由两、三个码位组成的 emoji 除了少数例外,均以两个 emoji CQ 码的形式出现,即同样可以正确互转。但其中的例外,就是其中以 002300AE 为第一码位的符号 emoji,这些 emoji 在一个 CQ 码中以一个较大的数字出现,目前规律未知。

http://www.unicode.org/Public/emoji/11.0/emoji-zwj-sequences.txt 这个里面的超复杂的组合 emoji,在 CQ 码中,没有大数字,但其中的 200D 似乎被保留为原始的二进制值,而不是转换成连续的 CQ 码;与此同时,如果在发送时将 200D 以 CQ 码形式发送,将会发出多个拆散的 emoji,其中的规律未知。

stdrc commented 6 years ago

一种最简单的考虑是直接取消 emoji CQ 码和 Unicode 之间的转换,但是这样,还是不能解决上面描述的最后一个问题,而且,太过于简单粗暴,不够优雅

jqqqqqqqqqq commented 6 years ago

🤔发现这个 emoji 好像发不过去

stdrc commented 6 years ago

🤔发现这个 emoji 好像发不过去

这个可能无解,🤔 这玩意已经是单个码点的 emoji 了,code point 是 1F914,大概只能用 [CQ:emoji,id=129300] 表示

jqqqqqqqqqq commented 6 years ago

好的,那就是 emoji 的特殊 encode 代码我还得找回来 这个在 coolq 那个大长串的特殊表情码里吧?

stdrc commented 6 years ago

什么特殊表情码(

stdrc commented 6 years ago

但其中的例外,就是其中以 0023 到 00AE 为第一码位的符号 emoji,这些 emoji 在一个 CQ 码中以一个较大的数字出现,目前规律未知。

这个问题只涉及到从酷 Q 到外部的情况,通过对 id 设置特例来解决了。

这个里面的超复杂的组合 emoji,在 CQ 码中,没有大数字,但其中的 200D 似乎被保留为原始的二进制值,而不是转换成连续的 CQ 码;与此同时,如果在发送时将 200D 以 CQ 码形式发送,将会发出多个拆散的 emoji,其中的规律未知。

这个问题,发现当前代码中能够正常双向传输,不存在问题。