emoji表情限制(还需要改)
总算玩完拓展可以回来歇歇,可以整理点东西了。因为跟PC端的数据交互,要求一些特殊字符不能够存在,在限制输入框的时候,最难搞的就emoji表情的限制,因为没办法过滤完全,一开始用正则表达式的时候,iOS系统键盘九宫格给限制住完全使用不了,因为它每一个点击,都是一个特殊字符①②····到⑨,正则限制就完了。另外一个问题是,就算更改了限制,可以使用了,系统键盘根据文字联想出来的emoji表情,这时候利用notification还是delegate都是没办法直接获取到该字符,进行判断。后来利用下面这段代码,在textfield的notification里面,获取到当前字符,根据占的字节位,判断到是不是emoji表情,再回退两个占位符就可以了。
- (BOOL)stringContainsEmoji:(NSString *)string
{
// 过滤所有表情。returnValue为NO表示不含有表情,YES表示含有表情
__block BOOL returnValue = NO;
[string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
const unichar hs = [substring characterAtIndex:0];
// surrogate pair
if (0xd800 <= hs && hs <= 0xdbff) {
if (substring.length > 1) {
const unichar ls = [substring characterAtIndex:1];
const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f) {
returnValue = YES;
}
}
} else if (substring.length > 1) {
const unichar ls = [substring characterAtIndex:1];
if (ls == 0x20e3) {
returnValue = YES;
}
} else {
// non surrogate
if (0x2100 <= hs && hs <= 0x27ff) {
returnValue = YES;
} else if (0x2B05 <= hs && hs <= 0x2b07) {
returnValue = YES;
} else if (0x2934 <= hs && hs <= 0x2935) {
returnValue = YES;
} else if (0x3297 <= hs && hs <= 0x3299) {
returnValue = YES;
} else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {
returnValue = YES;
}
}
}];
return returnValue;
}
//代码截取,但是会有很大的问题,因为不是所有的emoji都是两个占位符4个字节,截断就变成了乱码
NSString *toBeString = textField.text;
if ([NSString stringContainsEmoji: toBeString]) {
textField.text = [toBeString substringToIndex:toBeString.length -2];
}