Blog Ckeditor新增Emoji表情,文章都会笑啦
 2018-12-21 10:56:15   1037   0   

本文最后更新于天前,文中介绍内容及环境可能已不适用.请谨慎参考.

😆先来点表情镇楼..😅🤩🦊🍸😓😡,本文使用ckeditor版本为4.11.1 👽 

 

之前就想给ckeditor添加表情的,一直没空下来,刚好最近抓到点时间,搞搞,

结果这里倒是发现了一个大坑.

 

不过一番折腾,反而对cheditor的插件机制 及emoji 相关更了解了一点。

而且后面还引发出了prerender的问题,折腾了一晚上加一早上,还学会了用vs code调试nodejs,还好找到问题了。

 

好吧,这就是后话了,反正引出了好多东西,感觉不会的东西更多了。。😥

 

Ckeditor版本及插件.

之前使用的ckeditor为4.8,而Eomji是从ckeditor4.10开始引入的,必须要更新下版本呢,

本来想换位ckeditor5的,但是发现改动比较大,有些东西不好调,而且与目前的一些字段定义插件不兼容,

那就罢了.直接更新4.11吧。

 

之前的ckeditor都有点忘了是怎么下下来的,反正捣鼓了一堆插件也没用上。自己修改了config.js简化不少,

4.11 ckeditor更新

现在直接下一个完整版的4.11下来发现按钮各种多。。🙄,

而且发现plugins目录下的插件都没有js,原来直接在官网build下来的插件,js都会集成压缩到ckeditor.js 中,

这样虽然方便使用,但是及其不方便修改和查看。

比如整合CKAwesome时,插件里面引用了select2,与我页面上的有冲突,非得改下代码才好。

 

在官方这个在线build界面发现右边点击每个插件,可以直接查看插件自己的网页,

后来就一个个的把需要的插件下下来,在config.js中自己整合,

 

整合了Emoji,smile,CKAwesome 三个。当然都有些小修改,这就是单独下载的好处了,可以随意修改。

这里增加了preview,可以预览.

整合

https://ckeditor.com/cke4/addon/emoji

下载集成就好,当然需要把依赖的其他插件 autocomplete,textmatch,ajax,panelbutton,floatpanel

都一个个下好。

	CKEDITOR.plugins.add( 'emoji', {
		requires: 'autocomplete,textmatch,ajax,panelbutton,floatpanel',
		lang: 'en', // %REMOVE_LINE_CORE%
		icons: 'emojipanel',
		hidpi: true,

Emoji问题

乱码

插件配置好后,编辑一点问题没有,cool~😉

保存,然后查看首页。。

好家伙,直接乱码,显示 小方块,但是再编辑的时候是正常的。

原因

研究一番后发现网上说的都不适用。

本blog存储使用的unicode,所有文字输入都会escape转码存储.,数据库直接存储的

😀,是没有问题的.

在Controller中取出来就是😀符号了。但是到页面上就是乱码了。

再研究一番发现,html中显示需要转化为对应的html实体 转义符号,例如 😀 这样。

 

 

其实就是&#x +符号的unicode 16进制编码。

Emoji符号说明 unicode.org 

 

解决

就是页面显示的时候需要拼接&#x+16进制unicode,那么为了方便统一处理,后台存储的时候肯定不能直接存储成😀 这样了。

其实也简单,存储的时候匹配所有的Emoji符号, 计算出 符号的 unicode 编码, 用统一标准存储,

 比如😀 --》统一加前缀 &#x和后缀;   变成  😀;

前台呈现的时候,将&#x 统一替换为 &#x即可。 即  😀  

这样就是可以自动转换了。

问题点

那么问题也来了,怎么检查Emoji符号,怎么用js转化为 emoji对应的 unicode符号?

Emoji符号基本上是两位16进制字符组成,根据unicode emoji网站说明及google的结果,我这里使用了如下的匹配

/(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c\ude32-\ude3a]|[\ud83c\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g;

关于计算 两位16进制Emoji字符转成 32位的unicode的方法,

我这里参考了JDK中的Character.class 里面codePointAt 方法来实现。

 // Optimized form of:
        // return ((high - MIN_HIGH_SURROGATE) << 10)
        //         + (low - MIN_LOW_SURROGATE)
        //         + MIN_SUPPLEMENTARY_CODE_POINT;

如下:

function KChar(options){
		
		this.default={
				    MIN_SUPPLEMENTARY_CODE_POINT : 0x010000,
				     MIN_HIGH_SURROGATE : '\uD800'.charCodeAt(0),
				     MIN_LOW_SURROGATE  : '\uDC00'.charCodeAt(0),
				     MAX_HIGH_SURROGATE : '\uDBFF'.charCodeAt(0),
				     MAX_LOW_SURROGATE  : '\uDFFF'.charCodeAt(0),
				     MIN_CODE_POINT : 0x000000,
				     MAX_CODE_POINT:0X10FFFF,
		};
	
		
	} ;
	
	KChar.prototype.isHighSurrogate=function(ch){
		var me=this;
		 return ch >= me.default.MIN_HIGH_SURROGATE && ch < (me.default.MAX_HIGH_SURROGATE + 1);
	}
	
	KChar.prototype. isLowSurrogate=function( ch) {
		var me=this;
	        return ch >= me.default.MIN_LOW_SURROGATE && ch < (me.default.MAX_LOW_SURROGATE + 1);
	    }

	KChar.prototype.codePointAt=function(seq,index) {
		var me=this;
	        var c1 = seq.charCodeAt(index);
	        if (me.isHighSurrogate(c1) && ++index < seq.length) {
	            var c2 = seq.charCodeAt(index);
	            if (me.isLowSurrogate(c2)) {
	                return me.toCodePoint(c1, c2);
	            }
	        }
	        return c1;
	    }
	
	KChar.prototype.toCodePoint=function(high,low) {
		var me=this;

		 var codept= ((high << 10) + low) + ( me.default.MIN_SUPPLEMENTARY_CODE_POINT
	             - ( me.default.MIN_HIGH_SURROGATE << 10)
	             -  me.default.MIN_LOW_SURROGATE);
	        return codept;
	    }

 

然后将转化的数字转为16进制显示即可

// 返回emoji表情的 unicoe 数字
	window.$kchar.codePointAt=function(str){
		
		return kchar.codePointAt(str,0).toString(16);
		
	};

这里我封装了一个JS,比较方便。

下载  点击这里下载

使用如下:

	
var withemojihtml= $kchar. replaceEmoji(inputhtmldata);

 

github:

https://github.com/kxjl168/kchar

 

其他插曲

本来昨天就想写这个文章的,但是

回家搞google验证搞了一晚上,没搞定!😱。。

google站点的认证,使用html认证,怎么返回的都是 带 <html><head>...的数据。

 

今天发现妈蛋的被prerender拦截了,prerender调用 chorme 来加载网页的时候,会与大部分浏览器一样自动加上

<html><head>。。。。😭😠。。

 

不过总算搞定了!

而且发现nodejs 直接用vscode 打开就可以直接运行,调试,不得不说牛的一米,😏

 

 

 

------------------------

附录mysql utf8mb4

普通mysql,使用utf8mb4存储 emoji

mysql ,my.conf配置 服务器utf8mb4格式。


[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4


[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

 

数据库设置为utf8mb4格式。

-- 修改库
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; 

--修改字段
ALTER TABLE sys_operlog CHANGE data data text  CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  COMMENT '操作数据';

 


 2019-09-30 10:18:22 
 1

  本文基于CC BY-NC-ND 4.0 许可协议发布,作者:野生的喵喵 固定链接: 【Blog Ckeditor新增Emoji表情,文章都会笑啦】 转载请注明



发表新的评论
{{s_uid}}   , 欢迎回来.
您的称呼(*必填):
您的邮箱地址(*必填,您的邮箱地址不会公开,仅作为有回复后的消息通知手段):
您的站点地址(选填):
留言:

∑( ° △ °|||)︴

(๑•̀ㅂ•́)و✧
<( ̄) ̄)>
[]~( ̄▽ ̄)~*
( ̄ˇ ̄)
[]~( ̄▽ ̄)~*
( ̄ˇ ̄)
╮( ̄▽ ̄)╭
( ̄ε(# ̄)
(⊙ˍ⊙)
( ̄▽ ̄)~*
∑( ° △ °|||)︴

文章分类

可能喜欢 

KxのBook@Copyright 2017- All Rights Reserved
Designed and themed by 野生的喵喵   1345171   38300