在提交数据发送网络请求,由于用户输入了emoji表情,服务端返回系统异常,体验感很差。为了解决服务器不能验证emoji编码的问题,需要在本地进行emoji的输入控制(一般情况应该由服务器在数据库中添加emoji对应的转码表以支持客户端发送emoji表情)。
所以就有了这个需求:在TextField或者TextView中,限制输入任何表情符号,(包括系统自带的表情,第三方键盘带的表情,还有某些汉字类型的表情)。
利用下面这个方法stringContainsEmoji可以限制系统键盘自带的表情
/**
* 判断字符串中是否存在emoji
* @param string 字符串
* @return YES(含有表情)
*/
+ (BOOL)stringContainsEmoji:(NSString*)string {
__blockBOOLreturnValue =NO;
[stringenumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:
^(NSString*substring,NSRangesubstringRange,NSRangeenclosingRange,BOOL*stop) {
constunicharhs = [substringcharacterAtIndex:0];
// surrogate pair
if(0xd800<= hs && hs <=0xdbff) {
if(substring.length>1) {
constunicharls = [substringcharacterAtIndex:1];
constintuc = ((hs -0xd800) *0x400) + (ls -0xdc00) +0x10000;
if(0x1d000<= uc && uc <=0x1f77f) {
returnValue =YES;
}
}
}elseif(substring.length>1) {
constunicharls = [substringcharacterAtIndex:1];
if(ls ==0x20e3) {
returnValue =YES;
}
}else{
// non surrogate
if(0x2100<= hs && hs <=0x27ff) {
returnValue =YES;
}elseif(0x2B05<= hs && hs <=0x2b07) {
returnValue =YES;
}elseif(0x2934<= hs && hs <=0x2935) {
returnValue =YES;
}elseif(0x3297<= hs && hs <=0x3299) {
returnValue =YES;
}elseif(hs ==0xa9|| hs ==0xae|| hs ==0x303d|| hs ==0x3030|| hs ==0x2b55|| hs ==0x2b1c|| hs ==0x2b1b|| hs ==0x2b50) {
returnValue =YES;
}
}
}];
returnreturnValue;
}
/**
* 判断字符串中是否存在emoji
* @param string 字符串
* @return YES(含有表情)
*/
+ (BOOL)hasEmoji:(NSString*)string
{
NSString *pattern = @"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]";
NSPredicate*pred = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", pattern];
BOOLisMatch = [predevaluateWithObject:string];
returnisMatch;
}
/**
判断是不是九宫格
@param string 输入的字符
@return YES(是九宫格拼音键盘)
*/
+(BOOL)isNineKeyBoard:(NSString*)string
{
NSString*other =@"➋➌➍➎➏➐➑➒";
intlen = (int)string.length;
for(inti=0;i
{
if(!([otherrangeOfString:string].location!=NSNotFound))
returnNO;
}
return YES;
}
上面这2个方法就可以完全限制住键盘输入所有的表情。但是今天突然发现系统自带的键盘九宫格输入汉字不能使用了。
最终发现当使用九宫格输入汉字时候,九宫格输入的本身就是表情,九宫格对应的是下面➋➌➍➎➏➐➑➒的字符。所有用上面2个方法就把这些表情限制了,导致不能输入汉字。
既然找到了问题所在,那么开始撸代码:
利用下面这个方法isNineKeyBoard可以判断当前是不是在使用九宫格输入
/**
判断是不是九宫格
@param string 输入的字符
@return YES(是九宫格拼音键盘)
*/-(BOOL)isNineKeyBoard:(NSString*)string{NSString*other =@"➋➌➍➎➏➐➑➒";intlen = (int)string.length;for(inti=0;i
下面就是现在UITextView禁止输入表情的重要代码,记得遵守代理~
#pragma mark -------UITextViewDelegate-(BOOL) textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text{}
UITextField在下面这个方法中写就行
- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string{
if([textFieldisFirstResponder]) {
if ([[[textField textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textField textInputMode] primaryLanguage]) {
returnNO;
}
//判断键盘是不是九宫格键盘
if([TKPublicisNineKeyBoard:string] ){
returnYES;
}else{
if([TKPublichasEmoji:string] || [TKPublicstringContainsEmoji:string]){
returnNO;
}
}
if(textField.text.length==20){
if([stringisEqualToString:@""]) {
returnYES;
}else
returnNO;
}
}
return YES;
}
另外附上几个有用的方法:
//-----过滤字符串中的emoji
- (NSString*)disable_emoji:(NSString*)text {
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]"options:NSRegularExpressionCaseInsensitive error:nil];
NSString*modifiedString = [regexstringByReplacingMatchesInString:text
options:0
range:NSMakeRange(0, [textlength])
withTemplate:@""];
returnmodifiedString;
}
/**
* 判断 字母、数字、中文
*/
- (BOOL)isInputRuleAndNumber:(NSString*)str
{
NSString*other =@"➋➌➍➎➏➐➑➒"; //九宫格的输入值
unsignedlonglen=str.length;
for(inti=0;i
{
unichara=[strcharacterAtIndex:i];
if(!((isalpha(a))
||(isalnum(a))
// ||((a=='_') || (a == '-')) //判断是否允许下划线,昵称可能会用上
||((a==' ')) //判断是否允许空格
||((a >=0x4e00&& a <=0x9fa6))
||([otherrangeOfString:str].location!=NSNotFound)
))
returnNO;
}
return YES;
}
注意:上面这种方法可以限制键盘输入任何表情符号,但是如果需求是必须要输入表情,而且要下次服务器把这个表情返回,还要回显到页面上,就要看下面这篇文章