分析了公众号源码,原来标题可以加emoji!

公众号上发表了一篇文章,原本希望在文章的标题中添加一个 emoji 表情符 💉,直接被提示错误:“标题中不能含有特殊字符”。

图片

公众号标题特殊字符报错

当时也没有多想,以为 emoji 表情符被公众号标题给禁用了。

可是过了一段时间,发现有些公众号文章的标题是可以包含表情符的,比如:🤙🥗🥘🦋🤩。

这激起了我的好奇心,到底哪些 emoji 表情符可以加入到公众号的标题中?

带着这个问题,首先网上搜索了一番。得到的答案要么是某个编辑器的推广文案,要么是零星地列出几种可以使用的 emoji 表情符号。没有一个答案是完美的。

我希望能够一网打尽所有可以在公众号标题可用的 emoji 表情符。于是便有了这篇文章,描述一下我是如何找到想要的答案的。

先说一下结论:

emoji 表情符总共 1847 个 ,公众号标题可用的是 396 个,占总数的 21%。可用表情符占比

如果你想知道这 396 个 emoji 都是哪些,那么可以直接跳到文件的结尾,我已经都列出来了。

如果你继续看下去,你还可以从中了解我的解题思路,包括以下一些内容:

  1. 如何使用 ChartGPT 帮助解读代码

  2. 限制标题使用 emoji 的正则表达式

  3. Unicode 编码转换 UTF 16 的方式

1. 找到报错的地方

现在唯一的线索是报错的信息“标题中不能含有特殊字符”。根据经验判断,这个报错大概率是一个前端的 JavaScirpt 的功能实现。

让我们来尝试找找这个 js 文件。

在 DevTools 模式下,遍历 js 文件看看有没有包含报错信息关键字 标题

DevTools 模式

果然,在这个路径下找到了一段代码。

https://res.wx.qq.com/mpres/zh_CN/htmledition/js/default~advanced/menuSetting~bizpage/list~cardticket/member_message~discuss/list~discuss

a.title = function(n) {
    var o = n.content || ""
      , i = n.maxlen || 64;
    return A.rangelength(o, [0, i]) ? !e.test(o) || {
        msg: "%s中不能含有特殊字符".sprintf(n.label || "标题"),
        errType: 2
    } : {
        msg: "%s长度不能超过%s字".sprintf(n.label || "标题", i),
        errType: 1
    }
}

看这报错代码msg: "%s中不能含有特殊字符".sprintf(n.label || "标题"),这不正是我们需要的嘛!!

2. 使用 ChatGPT 解读代码

如何能快速地读懂代码?当红辣子鸡 ChatGPT 无疑是目前最好的选择。

现在,让 ChatGPT 帮我们解读一下上面的代码。

图片

ChatGPT 解释代码

答案很完美,找到我们关注的重点:

函数使用正则表达式 e 来检查内容中是否含有特殊字符。如果含有特殊字符,则返回一个错误对象。

代码中使用正则表达式 e 来判断是否含有特殊字符串。在这个 js 文件中继续搜索 e 寻找正则表达式。

问题的关键环节出现了:

 var e = /[\u2600-\u27BF]|[\u2B00-\u2BFF]|[\u3291-\u32B0]|[\uD83C\uD83D][\uDC00-\uDFFF]/

3. 理解制定规则的正则表达式

这个正则表达式本身并不复杂,但这些是如何跟 emoji 表情关联的呢?

这涉及到对字符集的理解。

简单地说,每个 emoji 都有自己的 Unicode 编码。

比如,⭐ 的编码就是 U+2B50。这个编码被正则表达中的第二部分 [\u2B00-\u2BFF] 匹配,所以它就属于“特殊字符”。

4. Unicode 代码转换为 UTF 16

理解这个正则表达式的时候,问题发生在最后一部分 [\uD83C\uD83D][\uDC00-\uDFFF]

这跟平时正常看到的 emoji 的 Unicode 编码匹配不上。理解这段代码需要两个前提:

  1. 知道 Javascript 中 emoji 都转换成 UTF 16

  2. 知道 Unicode 如何转换成 UTF 16

Unicode 转换成 UTF 16 分两种情况。

之前介绍的 ⭐ U+2B50,只有两个字节,所以它的 UTF 16 和 Unicode 一样都是 U+2B50

而我们经常使用的😀 U+1F600 长度超过了两个字节,需要转换成高位代理对和低位代理对,具体方法如下图。

图片

Unicode 转换 UTF 16

😀 U+1F600 转换成 UTF 16 U+D83D U+DE00,可以被正则表达式中的最后一部分 [\uD83C\uD83D][\uDC00-\uDFFF] 匹配,所以它也属于“特殊字符”。

5. 找到所有可以使用的 emoji 表情符

明白了规则之后,我们就来找出所有可以使用的 emoji 表情符。

访问 unicode 官网,找到所有的 emoji 表情符。

https://unicode.org/emoji/charts/full-emoji-list.html

然后,将官网的 emoji 表格复制到一个新建的页面,再手写一段 js 代码,查出所有可以使用的表情符,大功告成!

var e = /[\u2600-\u27BF]|[\u2B00-\u2BFF]|[\u3291-\u32B0]|[\uD83C\uD83D][\uDC00-\uDFFF]/;

$("table tr").each(function(){
    var char = $(this).find('td.chars').text();
    if(!e.test(char)){
        i++;
        var num = $(this).find('td.rchars').text();
        var unicode = $(this).find('td.code').text();
        console.log(`${num} ${char} ${unicode} `);
    }
});

6. 结果

在现有规则下,总共 396 个 emoji 表情符可以被公众号标题所使用,这里分享给大家,希望能给大家的公众号标题添加一抹颜色。

typeemoji
face-smiling

🤣🫠

face-affectionp

🥰🤩🥲

face-tonguep

🤪🤑

face-hand

🤗🤭🫢🫣🤫🤔🫡

face-neutral-skeptical

🤐🤨🫥🤥

face-sleepy

🤤

face-unwell

🤒🤕🤢🤮🤧🥵🥶🥴🤯

face-hat

🤠🥳🥸

face-glasses

🤓🧐

face-concerned

🫤🥺🥹🥱

face-negative

🤬

face-costume

🤡🤖

heart

🧡🤎🤍

hand-fingers-open

🤚🫱🫲🫳🫴

hand-fingers-partial

🤌🤏🤞🫰🤟🤘🤙

hand-single-finger

🫵

hand-fingers-closed

🤛🤜

hands

🫶🤲🤝

hand-prop

🤳

body-parts

🦾🦿🦵🦶🦻🧠🫀🫁🦷🦴🫦

person

🧒🧑🧔🧑‍🦰🧑‍🦱🧑‍🦳🧑‍🦲🧓

person-gesture

🧏🤦🤷

person-role

🥷🫅🤴🧕🤵🤰🫃🫄🤱

person-fantasy

🤶🦸🦹🧙🧚🧛🧜🧝🧞🧟🧌

person-activity

🧍🧎🧑‍🦯🧑‍🦼🧑‍🦽🧖🧗

person-sport

🤺🤸🤼🤽🤾🤹

person-resting

🧘

family

🧑‍🤝‍🧑

person-symbol

🫂

hair-style

🦰🦱🦳🦲

animal-mammal

🦍🦧🦮🦊🦝🦁🦄🦓🦌🦬🦙🦒🦣🦏🦛🦫🦔🦇🦥🦦🦨🦘🦡

animal-bird

🦃🦅🦆🦢🦉🦤🪶🦩🦚🦜

animal-reptile

🦎🦕🦖

animal-marine

🦭🦈🪸

animal-bug

🦋🪲🦗🪳🦂🦟🪰🪱🦠

plant-flower

🪷🥀

plant-other

🪴🪹🪺

food-fruit

🥭🫐🥝🫒🥥

food-vegetable

🥑🥔🥕🫑🥒🥬🥦🧄🧅🥜🫘

food-prepared

🥐🥖🫓🥨🥯🥞🧇🧀🥩🥓🥪🫔🥙🧆🥚🥘🫕🥣🥗🧈🧂🥫

food-asian

🥮🥟🥠🥡

food-marine

🦀🦞🦐🦑🦪

food-sweet

🧁🥧

drink

🥛🫖🥂🥃🫗🥤🧋🧃🧉🧊

dishware

🥢🥄🫙

place-map

🧭

place-building

🧱🪨🪵

transport-ground

🦽🦼

transport-air

🪂

hotel

🧳

time

⌛⏳⌚⏰⏱⏲

sky & weather

🪐

event

🧨🧧

award-medal

🥇🥈🥉

sport

🥎🥏🥍🥊🥋🥅🤿🥌

game

🪀🪁🪄🧩🧸🪅🪩🪆

arts & crafts

🧵🪡🧶🪢

clothing

🥽🥼🦺🧣🧤🧥🧦🥻🩱🩲🩳🩴🥾🥿🩰🧢🪖

musical-instrument

🪗🪕🥁🪘

computer

🪫⌨🧮

light & video

🪔

money

🪙🧾

tool

🪓🪃🪚🪛🦯🪝🧰🧲🪜

science

🧪🧫🧬

medical

🩸🩹🩼🩺🩻

household

🪞🪟🪑🪠🪤🪒🧴🧷🧹🧺🧻🪣🧼🫧🪥🧽🧯

other-object

🪦🧿🪬🪧🪪

arrow

↗️↘️↙️↖️↕️↔️↩️↪️⤴️⤵️

av-symbol

▶️⏩⏭️⏯️◀️⏪⏮️⏫⏬⏸️⏹️⏺️⏏️

punctuation

‼️⁉️〰️

other-symbol

〽©®™

keycap

#️⃣*️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣

alphanum

ℹⓂⓂ️

geometric

◼◻◾◽▪▫

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值