C++ 判断是否存在Emjoi表情
弄了很久才弄出来,做个记录
bool isContainEmoji(const std::string str)
{
bool bContain = false;
std::u16string ut16 = {};
if (StringUtils::UTF8ToUTF16(str, ut16))
{
if (false == ut16.empty())
{
size_t len = ut16.length();
for (size_t i = 0; i < len; ++i)
{
char16_t hs = ut16[i];
if (0xd800 <= hs && hs <= 0xdbff)
{
if (ut16.length() > (i + 1))
{
char16_t ls = ut16[i + 1];
int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f)
{
bContain = true;
break;
}
}
}
else
{
if (0x2100 <= hs && hs <= 0x27ff)
{
bContain = true;
}
else if (0x2B05 <= hs && hs <= 0x2b07)
{
bContain = true;
}
else if (0x2934 <= hs && hs <= 0x2935)
{
bContain = true;
}
else if (0x3297 <= hs && hs <= 0x3299)
{
bContain = true;
}
else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50)
{
bContain = true;
}
else if (hs >= 0x2600 && hs <= 0x27BF) // 杂项符号与符号字体
{
bContain = true;
}
else if (hs == 0x303D || hs == 0x2049 || hs == 0x203C || hs == 0x205F)
{
bContain = true;
}
else if (hs >= 0x2000 && hs <= 0x200F)//
{
bContain = true;
}
else if (hs >= 0x2028 && hs <= 0x202F)//
{
bContain = true;
}
else if (hs >= 0x2065 && hs <= 0x206F)
{
bContain = true;
}
/* 标点符号占用区域 */
else if (hs >= 0x2100 && hs <= 0x214F)// 字母符号
{
bContain = true;
}
else if (hs >= 0x2300 && hs <= 0x23FF)// 各种技术符号
{
bContain = true;
}
else if (hs >= 0x2B00 && hs <= 0x2BFF)// 箭头A
bContain = true;
else if (hs >= 0x2900 && hs <= 0x297F)// 箭头B
bContain = true;
else if (hs >= 0x3200 && hs <= 0x32FF)// 中文符号
bContain = true;
else if (hs >= 0xD800 && hs <= 0xDFFF)// 高低位替代符保留区域
bContain = true;
else if (hs >= 0xE000 && hs <= 0xF8FF)// 私有保留区域
bContain = true;
else if (hs >= 0xFE00 && hs <= 0xFE0F)// 变异选择器
bContain = true;
else if (hs >= 0x10000)
bContain = true;
}
}
}
}
return bContain;
}