立即注册 登录
彼岸网 返回首页

天香公主的个人空间 http://www.bian-wang.com/discuz/?10005 [收藏] [复制] [分享] [RSS] txgz999@yahoo.com

日志

如何支持图像字符

热度 4已有 631 次阅读2018-2-4 01:28 AM |个人分类:Discuz

图像字符(emoji,绘文字)(链接) 在社交工具里广泛使用,这些图案简单而又生动。最近在华人时空网上看到有网友抱怨在评论中加了一个表示赞的图像字符后,该图像字符以及它后面的所有文字在提交后都消失了(链接)。试了下几个用Discuz建造的网站都有这问题,唯一的例外是北美华人e网,它是用Discuz!NT造的,这是个前台ASP.NET后台SQL Server的Discuz版本,它就没有这样的问题。那么问题是出在PHP还是Mysql呢?
这事还得从绘文字如何成为字符说起。统一码(unicode)是一个给各种字符编号(code point)的国际标准。比如大写的英文字母A在那里排第65号,这个标准在不断扩充,不断在给新的字符编号。在2005年公布的6.0版本里给很多有趣的绘文字编了号。例如火箭 被编为第128640号(用十六进制表示是1F680)。但是要传输一连串字符光有编号是不够的,因为接收方无法从传过来的字节串里正确分离出字符。这就是编码的作用了。编码以一定规律将编号转变成另一个数字,这些数字串起来后还可以分离得开。UTF-8就是最常用的一种编码,它的编码里的每个字节里的0/1排位有一定规律,使得多个编码发送后接收方可以还原这些编码。Discuz软件就提供了使用UTF-8的版本。下面的表格显示了UTF-8的编码方式(链接):

统一码编号范围(十进制) 编号范围(十六进制) 编号二进制数值形式 UTF-8编码形式
0-127 0-7F xxxxxxx
(最多7位数)
0xxxxxxx
(单字节)
128-2,047 80-7FF xxxxxxxxxxx
(8-11位数)
110xxxxx 10xxxxxx
(双字节)
2,048-65,535 800-FFFF xxxxxxxxxxxxxxxx
(12-16位数)
1110xxxx 10xxxxxx 10xxxxxx
(三字节)
65,536-1,114,111 10000-10FFFF xxxxxxxxxxxxxxxxxxxxx
(17-20位数加上一部分21位数)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(四字节)

通常我们将统一码编号分成17个组(称为平面),每个平面包含65,536个连续的编号。第一个平面,包含从0到FFFF的编号,称为基本多文种平面。其余10000-1FFFF,20000-2FFFF,。。。,F0000-FFFFF,100000-10FFFF 共十六个平面均称为辅助平面。从上表可见,基本多文种平面里的编号的UTF-8编码最多是三字节,而辅助平面里的编号的UTF-8编码都是四字节。常用的汉字字符都在基本多文种平面里800外,所以它们的编码都是三字节,而绘文字字符多在第一辅助平面里,所以它们的编码都是四字节。

经查Discuz UTF-8版的安装程序在mysql数据库里加的数表使用的都是utf8字符集,它只支持最多3个字节的utf-8字符。这就是图像字符无法在mysql数据库里保存的原因。Mysql认识到这个问题,在5.5.3版里添加了一个新的字符集叫utf8mb4来支持占用4个字节的字符。我们将表列改用utf8mb4后就可以储存图像符号。

具体的讲我们需要做两个修改(参见 链接):
1)在网站里的设置文件 config/config_global.php里将下面这句 $_config['db']['1']['dbcharset'] = 'utf8'; 改为 $_config['db']['1']['dbcharset'] = 'utf8mb4';
2)在数据库里将要保存图像符号的表列改用utf8mb4字符集。比如我们要在日志评论里支持图像字符的话,就在数据库里运行 (假定数据表名没加前缀): ALTER TABLE home_comment MODIFY message text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL; 类似的,如果要在日志的标题和内容里支持图像符号的话就运行 ALTER TABLE home_blog MODIFY subject char(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL; ALTER TABLE home_blogfield MODIFY message mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

去年贝壳村里出了些李鬼也与统一码有关。有人注册了些与多位名博主几近相同的网名,但是仔细端详还是能看出马脚。比如那位管理员李鬼的个人资料页是这样的:http://www.backchina.com/home.php?mod=space&uid=369980&do=profile



仔细看窗口左上角网页的title就会发现这人的网名其实有四个字符,在管理员三字后还有个unicode字符\u0081。这个字符在统一码里排第129号,它是控制字符中的一个,本身不是印刷文字,而是用来操控文字的。因为在网页上这个控制字符不显示,所以在网页上无法区分管理员李鬼和真正的管理员。怎样在键盘上输入这样的字符呢?有多种方法,有些只在特定环境下才能用。按这里的介绍,一种普适的办法是在Firefox的Console里键入 copy('\u0081'),这样这个unicode字符\u0081就被拷贝到了clipboard里了,然后在要加入该字符的地方直接按paste即可。(注意对编号的16进制值多于4位数的unicode字符,我们需要在16进制值的外面加大括号,如\u{1F230})


要防止这种情况发生,网站可以在接受新注册用户名时对注册用户名所含的字符做个限制。关于要限制哪些字符可以参考这篇 http://m.blog.csdn.net/article/details?id=8270553,具体如何将这个限制加到网站去可以参考这篇 http://www.cnblogs.com/csandroid/p/3856540.html


发表评论 评论 (5 个评论)

回复 東里山人 2018-3-24 01:25 PM
我自己摸索着也试验UTF8MB4,发现了点问题。后台打开phpMyAdmin时,会提示编码问题,解决办法,打开phpMyAdmin/libraries/Charsets.php,将:“'utf-8'        => 'utf8',”改为“'utf-8'        => 'utf8mb4',”(这个估计phpMyAdmin的版本也有影响)。另外,修改后DZ在创建数据表列时会提示编码utf8错误,比如新建一个分类信息时。
回复 sco85 2018-2-5 06:50 AM
非常感谢  
回复 aikato 2018-2-4 01:02 PM
天香公主: 对,我文中就有这个链接。不过我没改那么多,只是试了试要在某个地方如日志评论里要支持emoji所需做的事。
喔是哦,嘻,我看完了整個網誌但沒留意鏈接這兩個字呢
回复 天香公主 2018-2-4 12:33 PM
aikato: https://blog.brownsugar.tw/discuz-support-emoji/
這裡有個參考教程喔,之前在網上找到並收藏了來看的
对,我文中就有这个链接。不过我没改那么多,只是试了试要在某个地方如日志评论里要支持emoji所需做的事。
回复 aikato 2018-2-4 12:12 PM
https://blog.brownsugar.tw/discuz-support-emoji/
這裡有個參考教程喔,之前在網上找到並收藏了來看的

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

小黑屋|Archiver|彼岸网  

Powered by Discuz! X3.1 © 2001-2014 Comsenz Inc.
GMT-4, 2018-7-21 06:40 PM , Processed in 0.054854 second(s), 8 queries. ,ApcOn

返回顶部