Rails Ruby 里面如何移除字符串中的 emoji 符号?

zlx_star · 2014年02月26日 · 最后由 zlx_star 回复于 2014年02月27日 · 8656 次阅读

一串中文文本里面含有 emoji 符号,如何能够移除 emoji 符号而不移除中文呢?

自己的想法是通过正则表达式移除特定一段 unicode 编码,但是尝试了很久都没成功。

比如

'🈶!回答:搪塞他们给自己介绍,到最后直接说一句已经有男朋友了,在谈着尼\n,准备带回家跟他们把把关!'

RubyChina 不能显示出原本的符号,直接上图了。符号是手机输入的 emoji 符号

请各路的大神帮忙。

据说根据字符内码的 range 进行 delete 的效果最好……

#1 楼 @wuwx 你是指对应字符的 unicode 编码吗?

http://en.wikipedia.org/wiki/Emoji#Regional_Indicator_Symbols http://www.unicode.org/faq/emoji_dingbats.html#4

搜了一下 emoji 在 unicode 6.3 里的编码范围

  • Miscellaneous Symbols, Pictographs, Emoticons: 1F300-1F64F
  • Transport and Map Symbols: 1F680-1F6FF

下面三个范围包括部分 emoji...:

  • Miscellaneous Technical: 2300-23FF
  • Miscellaneous Symbols: 2600-26FF
  • Dingbats: 2700-27BF

为了更精确做了点实验,发现上面三个范围中,这些是 emoji 符号:

231a, 231b, 23e9-23ec, 23f0, 23f3 2614, 2615, 2648-2653, 267f, 2693, 26a1, 26aa, 26ab, 26b3-26bd, 26bf-26e1, 26e3-26ff 2705, 270a, 270b, 2728, 274c, 274e, 2753, 2757, 2795, 2796, 2797, 27b0, 27bf

另外这个是特殊的:

  • Regional Indicator Symbol 1f1e6-1f1ff

这些是虚线框字母,但每两个连起来就能变成小国旗

最终的正则:

str.gsub /[\u{1F300}-\u{1F64F}\u{1F680}-\u{1F6FF}\u{1F1E6}-\u{1F1FF}
\u231A\u231B\u23E9-\u23EC\u23F0\u23F3
\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26B3-\u26BD\u26BF-\u26E1\u26E3-\u26FF
\u2705\u270A\u270B\u2728\u274C\u274E\u2753\u2757\u2795\u2796\u2797\u27B0\u27BF
\u{1F1E6}-\u{1F1FF}]/x, ''

大概... 可能会有遗漏...

如果用智能手机看的话是会显示的

搜到一个插件 chromoji 可以让 chrome 显示 emoji

#4 楼 @jjym 是的,5.1 的 MySQL 不支持 utf8mb4,所以存储会出错

#3 楼 @luikore 按照线索找到这个这个, 基本解决我的麻烦。

感谢各位

#7 楼 @zlx_star wiki 里的 mavericks emoji 列表要比 iOS 列表更完全一点

#8 楼 @luikore wiki 里面好像缺少 number 那块的内容,比如 1F236

需要 登录 后方可回复, 如果你还没有账号请 注册新账号