本帖將聚合一些跟emoji表情有關的知識;前端傳過來的昵稱和備注信息一定要經過嚴格的正則表達式過濾,放置出現XSS等攻擊,另外emoji字體表情庫應該使用base64_encode編碼,拿信息的時候base64_decode解碼即可。
相關文章:“i愛記賬” 小程序后端開發小結
相關組件:
wxParse:集成了emoji表情組件;
WxEmojiView-微信小程序Emoji展示輸入組件
純微信小程序 emoji解析組件
**相關demo: **
小程序學習用demo推薦:雨碎江南;emoji,評論(適用1221)
**相關討論1: **小程序Emoj解析 現在在采用Emoj這套組件開發 改裝后臺返回的表情數據 遇到個問題就是 循環出來的數據始終是一樣的 不知道還需要從哪兒修改.請大神指點
var WxEmoji = require('../../WxEmojiView/WxEmojiView.js');
var list = [{
microblog_id: "274", //主微博ID
sendUserInfo:{
content: "數據1 ~![01][02]"
}
},{
microblog_id: "274",
sendUserInfo:{
content: "數據2 ~![03][04]"
}
},{
microblog_id: "274",
sendUserInfo:{
content: "數據3~![05][06]"
}
}];
//先將中括號替換為可解析的::
for(var i = 0;i<list.length;i++){
var dt = list;
var str = dt.sendUserInfo.content;
// var str2 = str.replace(/[\[\]]/g,':');
var str2 = str.replace(/\[([^\[\]]+)\]/g,':$1:');
dt.sendUserInfo.content = str2;
}
Page({
data:{
list:""
},
onLoad: function(){
var that = this;
WxEmoji.bindThis(this);
for(var i = 0;i<list.length;i++){
WxEmoji.buildTextObjs(that,list.sendUserInfo.content);//使用生成文字
list.sendUserInfo.content = "";//清空默認的原文字
}
that.setData({
list:list
});
},
})
//模板文件循環
<block wx:for="{{list}}">
<view class="msg">
<view class="ty flex-1">
<view class="user_name">
張三
<text class="user_sex_level_male">21</text>
<text class="time">剛剛</text>
</view>
<view class="user_apartment">
天通北苑店
</view>
</view>
<view class="ty user_msg mt0">
<import src="../../WxEmojiView/WxEmojiView.wxml"/>
<template is="WxEmojiView" data="{{WxEmojiObjs}}"/>
</view>
</view>
</block>
回答者:Di 目前WxEmojiView我一直沒有更新,目前處于alpha0.1版本,所以不建議直接使用。
比較好的方案是,你從WxEmojiView的處理過程中借鑒并改造在你的小程序中,既然已經使用,那么問題定位 這個問題是因為我當時并沒有考慮多行使用的方案,所以我當時暴漏的時候沒有暴漏出相關多數據方法
WxEmoji.buildTextObjs(that,list.sendUserInfo.content);//使用生成文字
wxEmojiView的源碼中我只做了但數據處理,所以只會顯示最后一條數據,而且都是一樣的
function buildTextObjs(e,str){
var temObjs = {};
temObjs.WxEmojiTextArray = transEmojiStr(str);
__this.setData({
WxEmojiObjs:temObjs//這里直接返回了一個WxEmojiObjs
});
}
解決方案 改造方法,是建立在你不是用其他功能的基礎上
//1.改造方法buildTextObjs
function buildTextObjs(e,str){
var temObjs = {};
temObjs.WxEmojiTextArray = transEmojiStr(str);
return temObjs;
}
//2.使用方法
Page({
data:{
list:""
},
onLoad: function(){
var that = this;
WxEmoji.bindThis(this);
for(var i = 0;i<list.length;i++){
//改造這里
list.sendUserInfo.content = WxEmoji.buildTextObjs(that,list.sendUserInfo.content);
}
that.setData({
list:list
});
},
//3: 模版使用
<block wx:for="{{list}}">
<view class="msg">
<view class="ty flex-1">
<view class="user_name">
張三
<text class="user_sex_level_male">21</text>
<text class="time">剛剛</text>
</view>
<view class="user_apartment">
天通北苑店
</view>
</view>
<view class="ty user_msg mt0">
<import src="../../WxEmojiView/WxEmojiView.wxml"/>
<template is="WxEmojiView" data="{{WxEmojiObjs:item.sendUserInfo.content}}"/>
</view>
</view>
</block>
相關討論2:帶圖片的微信昵稱存數據庫亂碼或存不進去的解決辦法(作者:劉冰華)很多用戶的昵稱都帶有小圖標
如果將emoji表情直接存入utf8編碼的數據庫,會報錯,存不進去。因為編碼方式不同
解決方法:
存之前base64_encode(),取的時候base64_decode()
順道提醒:
存用戶昵稱時要考慮表情圖片這個因素,不一定===字符串字段編碼設置為utf8mb4之后,并沒有什么用,讀取顯示的時候都是一堆問號;
相關討論3:微信小程序無法發送的emoji表情在做一個聊天小程序,發言的時候需要發送輸入法中的emoji表情,但是在后端接收的時候收到的確實空字符串。不知道大家遇到過這樣的問題嗎?
需要從網上找一個js把emoji轉換成指定文字的庫然后從顯示端再轉換回來,這樣的話服務端需要做處理嗎?另外有什么好的js庫可以提供嗎? 這樣的話服務端可以不用處理了,因為編碼和反編碼都在前端進行了,庫github找找,我也沒用過,也是提供一個思路,不過我覺得一定是有這樣的庫的。
相關討論4: 我想請問一下各位在開發小程序的時候有遇到過獲取nickName昵稱時遇到有emoji表情時,存到數據庫emoji表情就變成了“???”這樣的情況嗎? 可以這個編碼,后臺識別編碼找表情.
解決方法:有個辦法可以解決,把數據格式blob類型儲存
我用個簡單方式解決你問題吧
1、String 轉 Blob: String content = "Hello World!"; Blob blob = Hibernate.createBlob(content.getBytes());
2、Blob 轉 String: Blob blob; try{ String content = new String(blob.getBytes((long)1, (int)blob.length())); } catch(SQLException e) { e.printStackTrace(); }
,就變成那樣了,不知道怎么把他搞出來;如果我不存進數據庫,就是先用json_encode然后馬上用json_decode,返回微信顯示是正常的;但是存到數據庫之后拿出來json_decode也是有問題,就轉不回去了先用urlencode下,取出的時候用urldecode
這個可以,我剛才試了,base64_encode這個函數其實也是可以,這兩個其實會不會有什么兼容問題? 不會存在兼容問題,php高版本也支持