最近遇到一個項目,客戶手機上發送的表情要在電腦網頁中顯示,沒有找到簡便方法,於是有了以下方案。
由於Emoji表情傳到后台是“口”,怎么找出接收數據中的表情是關鍵,各種搜索后,我用下面的正則表達式匹配到所有的Emoji表情,然后進行替換成圖片。
匹配表情的正則表達式
Regex reg = new Regex("(\uD83C[\uDDE8-\uDDFF]\uD83C[\uDDE7-\uDDFF])|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u2600-\u27ff][\uFE0F]|[\u2600-\u27ff]");
參考資料
emoji表情來自
http://www.emoji-cheat-sheet.com/(官方網站、名稱為英文版、在線)
https://github.com/Ranks/emojify.js(名稱為英文版 png)
https://punchdrunker.github.io/iOSEmoji/table_html/index.html(名稱為utf16轉10進制版)
emoji表情 json 對照文件來自
https://github.com/Ranks/emojify.js utf-16 name 對應 ios6(下文中Emoji_ios6)
https://github.com/github/gemoji 名稱表情對應(下文中Emoji_g)
替換方式:
1、表情替換為圖片 表情英文名稱版
Regex reg = new Regex("(\uD83C[\uDDE8-\uDDFF]\uD83C[\uDDE7-\uDDFF])|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u2600-\u27ff][\uFE0F]|[\u2600-\u27ff]");
MatchCollection match = reg.Matches(test_data);
string emoji_path = Server.MapPath("/Content/others/emoji.json");
StreamReader read = new StreamReader(emoji_path, Encoding.UTF8);
string json = read.ReadToEnd();
List<Emoji_g> emoji_list = JsonConvert.DeserializeObject<List<Emoji_g>>(json);
//StringBuilder sr = new StringBuilder();
//for (int i = 0; i < content.Length; i++)
//{
// sr.Append("\\u");
// sr.Append(((int)content[i]).ToString("X"));
//}
string emoji_str = string.Empty;
string emoji_value = string.Empty;
foreach (Match item in match)
{
StringBuilder sresult = new StringBuilder();
for (int i = 0; i < item.Length; i++)
{
sresult.Append(((int)item.Value[i]).ToString("X"));
}
Emoji_g emoji = emoji_list.Where(e => e.unicode == sresult.ToString()).FirstOrDefault();
Emoji_g e_teste = emoji_list.Where(e=>e.aliases[0]=="china").FirstOrDefault();
if (emoji != null)
{
test_data = test_data.Replace(item.Value, "<img style='width:22px' src='http://www.emoji-cheat-sheet.com/graphics/emojis/" + emoji.aliases[0] + ".png' />");
emoji_str = string.Empty;
emoji_value = string.Empty;
}
else
{
emoji_str += sresult.ToString();
emoji_value += item.Value;
emoji = emoji_list.Where(e => e.unicode == emoji_str).FirstOrDefault();
if (emoji != null)
{
test_data = test_data.Replace(emoji_value, "<img style='width:22px' src='http://www.emoji-cheat-sheet.com/graphics/emojis/" + emoji.aliases[0] + ".png' />");
emoji_str = string.Empty;
emoji_value = string.Empty;
}
}
}
return Content(test_data);
2、表情名稱為10進制數字版
Regex reg = new Regex("(\uD83C[\uDDE8-\uDDFF]\uD83C[\uDDE7-\uDDFF])|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u2600-\u27ff][\uFE0F]|[\u2600-\u27ff]");
MatchCollection match = reg.Matches(content);
string emoji_path = Server.MapPath("/Content/others/emoji_ios6.json");
StreamReader read = new StreamReader(emoji_path, Encoding.UTF8);
string json = read.ReadToEnd();
List<Emoji_ios6> emoji_list = JsonConvert.DeserializeObject<List<Emoji_ios6>>(json);
//StringBuilder sr = new StringBuilder();
//for (int i = 0; i < content.Length; i++)
//{
// sr.Append("\\u");
// sr.Append(((int)content[i]).ToString("X"));
//}
foreach (Match item in match)
{
StringBuilder sresult = new StringBuilder();
for (int i = 0; i < item.Length; i++)
{
sresult.Append(((int)item.Value[i]).ToString("X"));
}
Emoji_ios6 emoji = emoji_list.Where(e => e.utf16 == sresult.ToString()).FirstOrDefault();
if (emoji != null)
content = content.Replace(item.Value, "<img style='width:22px' src='/content/emoji/" + Convert.ToInt32(emoji.codepoint, 16) + ".png' />");
}
return content;
