首先說一下這個使用場景丹喻,MySQL 5.5.3之前的版本utf-8編碼是3個字節(jié)薄货,二系統(tǒng)表情是4個字節(jié),導致客戶端提交的帶有系統(tǒng)表情的字符串在后臺存入數(shù)據(jù)庫的時候發(fā)生系統(tǒng)表情存入失敗碍论,為了解決這個問題谅猾,大部分的做法是在客戶端編輯文本的過程中將系統(tǒng)表情過濾掉。當然MySQL 5.5.3之后的版本的編碼是4個字節(jié)了鳍悠,只需要后臺對數(shù)據(jù)進行一些簡單的編碼修改即可完全輕松的存儲系統(tǒng)表情了税娜,這個也是解決該問題的最理想的方式。
當然本文還是就客戶端過濾掉系統(tǒng)表情來說的藏研。具體的代碼如下:
1)如果是如果是UITextField敬矩,則需要監(jiān)聽通知
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則直接用其委托方法實現(xiàn)
- (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;
}