天天看点

C++ 判断是否存在Emjoi表情

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;
	}
           

继续阅读