首先说一下这个使用场景,MySQL 5.5.3之前的版本utf-8编码是3个字节,二系统表情是4个字节,导致客户端提交的带有系统表情的字符串在后台存入数据库的时候发生系统表情存入失败,为了解决这个问题,大部分的做法是在客户端编辑文本的过程中将系统表情过滤掉。当然MySQL 5.5.3之后的版本的编码是4个字节了,只需要后台对数据进行一些简单的编码修改即可完全轻松的存储系统表情了,这个也是解决该问题的最理想的方式。
当然本文还是就客户端过滤掉系统表情来说的。具体的代码如下:
1)如果是如果是UITextField,则需要监听通知
txtFld = [[UITextField alloc]initWithFrame:CGRectMake(50, 100, 200, 30)];//txtFld是个成员变量
txtFld.backgroundColor? = [UIColor redColor];
[self.view addSubview:txtFld];
txtFld.delegate = self;
[[NSNotificationCenter defaultCenter] addObserver:self? selector:@selector(changeText:) name:UITextFieldTextDidChangeNotification object:nil];
//过滤方法
- (void)changeText:(UITextField*)sender
{
NSLog(@"没有过滤前输入的字符串===%@",txtFld.text);
NSString *filterString = [self filterEmoji:txtFld.text];
NSLog(@"过滤Emoji表情后的字符串===%@",filterString);
txtFld.text = filterString;
}
2)如果是UITextView则直接用其委托方法实现
- (void)textViewDidChange:(UITextView *)textView
{
NSLog(@"没有过滤前输入的字符串===%@",textView.text);
NSString *filterString = [self filterEmoji:textView.text];
NSLog(@"过滤Emoji表情后的字符串===%@",filterString);
textView.text = filterString;
}
// ?正则过滤表情
- (NSString *)filterEmoji:(NSString *)text
{
if (!text.length) return 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 = [regex stringByReplacingMatchesInString:text
options:0
range:NSMakeRange(0, [text length])
withTemplate:@""];
return modifiedString;
}