如何判断一个nsstring emoji里是否含有emoji表情

11553人阅读
Emoji的介绍参见,iOS支持的emoji表情列表参见,iOS支持的emoji表情的Unicode编码范围为[0xE001,0xE05A]&[0xE101,0xE15A]&[0xE201,0xE253]&[0xE401&0xE44C]&[0xE501,0xE537],Unicode编码转为NSString的方法为[NSStringstringWithFormat:@"%C", i].使用如下代码可以弹出一个可以选择Emoji表情的输入框,
- (void)didSelectAFace:(id)sender{
UIButton&*button = (UIButton&*)
NSString&*emojiStr = [NSString&stringWithFormat:@"%C", button.tag];
textView.text&= [NSString&stringWithFormat:@"%@%@",textView.text,emojiStr];
- (void)hideEmojiView{
[emojiView&removeFromSuperview];
[emojiCloseButton&removeFromSuperview];
- (void)showEmojiView{
CGFloat&x = (self.view.frame.size.width-300.0f)/2;
CGFloat&y =&self.view.frame.size.height&-&190;
if&(emojiView&==&nil) {
self.emojiView&= [[UIView&alloc]&initWithFrame:CGRectMake(x,y,&300.0f,&140.0f)];
emojiView.backgroundColor&= [UIColor&lightGrayColor];
emojiView.alpha&=&0.8;
emojiView.layer.cornerRadius&=&6;
[emojiView.layer&setMasksToBounds:YES];
UIScrollView&*emojiScrollView = [[UIScrollView&alloc]&init];
emojiScrollView.frame&=&CGRectMake(0,&0&,300.0f,&140.0f);
[emojiView&addSubview:emojiScrollView];
int&xIndex =&0;
int&yIndex =&0;
int&emojiRangeArray[10] = {0xE001,0xE05A,0xE101,0xE15A,0xE201,0xE253,0xE401,0xE44C,0xE501,0xE537};
for&(int&j =&0&; j&10&; j+=2&) {
int&startIndex = emojiRangeArray[j];
int&endIndex = emojiRangeArray[j+1];
for&(int&i = startI i&= endI i++ ) {
UIButton&*button = [UIButton&buttonWithType:UIButtonTypeCustom];
button.frame&=&CGRectMake(6&+ xIndex*32,&6&+ yIndex*32,&32.0f,&32.0f);
[button&setTitle:[NSString&stringWithFormat:@"%C", i]forState:UIControlStateNormal];
button.tag&=
[button&addTarget:self&action:@selector(didSelectAFace:)forControlEvents:UIControlEventTouchUpInside];
[emojiScrollView&addSubview:button];
xIndex +=&1;
if&(xIndex ==&9) {
xIndex =&0;
yIndex +=&1;
[emojiScrollView&setContentSize:CGSizeMake(300.0f,&12&+ (yIndex+1)*32)];
//closeButton
self.emojiCloseButton&= [UIButton&buttonWithType:UIButtonTypeCustom];
emojiCloseButton.frame&=&CGRectMake(x-10.0f&, y-10.0f&,&24.0f,&24.0f);
[emojiCloseButton&setImage:[UIImage&imageNamed:@"dialog_close.png"]forState:UIControlStateNormal];
[emojiCloseButton&addTarget:self&action:@selector(hideEmojiView)forControlEvents:UIControlEventTouchUpInside];
emojiView.frame&=&CGRectMake(x,y,&300.0f,&140.0f);
emojiCloseButton.frame&=&CGRectMake(x-10.0f&, y-10.0f&,&24.0f,&24.0f);
[self.view&addSubview:emojiView];
[self.view&addSubview:emojiCloseButton];
iPhone Emoji Decimal Character Entities
The complete list of iPhone emoji and their respective decimal character entities:
转载地址:/post/1964/
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:259000次
积分:4122
积分:4122
排名:第3567名
原创:142篇
转载:30篇
评论:59条
(2)(1)(1)(3)(3)(6)(1)(1)(2)(7)(3)(6)(10)(8)(5)(10)(5)(1)(3)(2)(2)(7)(7)(13)(4)(3)(4)(11)(7)(16)(27)【iOS开发】屏蔽emoji表情输入
有朋友在询问,如何屏蔽emoji表情输入的问题,因为苹果自带的表情在其他设备上不支持。&
思路,在textfeild或者textview中,键入时候先判读是不是emoji的内容,如果是,就不返回给编辑框。&
代码如下:&
-&(BOOL)textField:(UITextField&*)textField&shouldChangeCharactersInRange:(NSRange)range&replacementString:(NSString*)string{
& &DLog(@"[[UITextInputMode
currentInputMode]primaryLanguage] is %@",);
& &if&([[[UITextInputMode&currentInputMode]primaryLanguage]&isEqualToString:@"emoji"])&{
&return&NO;
& &return&YES;
如果哪位朋友其他思路:比如让用户无法切换到emoji表情键盘,那就更好了~欢迎评论分享~谢谢~
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。posts - 72,&
comments - 181,&
trackbacks - 0
这个是我做Android以来碰到的最烦的东西,该死的emoji表情,恨之入骨。。无奈这个问题分配给我了。我也只能硬着头皮做。
0.吐个槽先
首先,你要明白什么是emoji表情,不知道的google,不需要支持emoji的可以绕道了。
emoji有很多不同的版本,我tm最讨厌的就是不同版本的了。Unified&DoCoMo&KDDI&Softbank&Google
因为ios5升级了,emoji编码从softbank变成unified了。所以只能Android这边改了。伤心。
我要做的工作就是把消息中含有的unified的emoji编码过滤出来,然后映射出对应的表情资源显示出来。
1.准备工作。
google下emoji表情的历史,google code上有个源码,不过是java的,那么你要把它改成java的。。(记得当初解析gif表情时也是把java改成android,可怜的我为咩总是干这活。。)
这里有个link,上面有所有的编码对应转换。
然后google code里有所有对应的编码转换的xml。叫emoji4unicode.xml. 这里是link:&
如果没兴趣我等下会直接贴代码的,但是最好你先自己弄明白解析的原理是什么,emoji表情一直在增加,以后要兼容你就得自己想办法了。
2.举个例子
black sun with rays unified :&U+2600 softbank:&U+E04A
如果以前你解析过softbank,应该很熟悉了。好歹它还有个大致得顺序,解析得时候只要判断是否在这个unicode范围内就可以了。so easy
可是unified完全是无顺序得,所以必须得自己建好映射。
因为原始的emoji.xml很大,把所有的描述信息都放里面了,我不需要,所以我写了个java把xml解析了一遍,然后重新生成了一个我需要的xml。贴个图出来大家看下。
you see , 这个原始的xml实在太大了,有162K,而且还是xml解析。。你想想多耗内存和时间。所以必须把它再转换一遍。
so 这个过程做好了,就可以进行下一步真正的解析了。。
3 解析过程。
因为emoji是有表情分组的,所以你要优先考虑解析出来的也是分好组的。
HashMap&String, ArrayList&String&& emoMap = new HashMap&String, ArrayList&String&&();
我是这么来分组的。
解析xml,然后把2600这样的字符串转换成unicode。这个很关键,映射对应不上肯定也解析不出来。要注意的一点是有的emoji是两个unicode组成的 &U+1F1F0 U+1F1F7 &这样。。所以么。又多了一个环节。
HashMap&List&Integer&, String& convertMap = new HashMap&List&Integer&, String&();
再定义一个map来存unicode和string字符的映射。
if&(xmlpull.getName().equals("e"))&{fromAttr&=&xmlpull.nextText();emos.add(fromAttr);List&Integer&&fromCodePoints&=&new&ArrayList&Integer&();if&(fromAttr.length()&&&6)&{String[]&froms&=&fromAttr.split("\\_");for&(String&part&:&froms)&{fromCodePoints.add(Integer.parseInt(part,&16));}}&else&{fromCodePoints.add(Integer.parseInt(fromAttr,&16));}convertMap.put(fromCodePoints,&fromAttr);}
这样就把整个解析都写到内存里了。这个就做成单例咯,在程序一进来,application里初始化。
4,解析过程
这里我是把emoji表情解析出来,再改成[e]2600[/e]的形式。然后再用正则再解析一遍(为什么这样做。。因为消息里面不可能只有emoji表情的啊亲。。。你还要解析另外的表情。)
下面是过滤emoji表情的方法:
public&String&parseEmoji(String&input)&{if&(input&==&null&||&input.length()&&=&0)&{return&"";}StringBuilder&result&=&new&StringBuilder();int[]&codePoints&=&toCodePointArray(input);List&Integer&&key&=&null;for&(int&i&=&0;&i&&&codePoints.&i++)&{key&=&new&ArrayList&Integer&()if&(i&+&1&&&codePoints.length)&{key.add(codePoints[i]);key.add(codePoints[i&+&1]);if&(convertMap.containsKey(key))&{String&value&=&convertMap.get(key);if&(value&!=&null)&{result.append("[e]"&+&value&+&"[/e]");}i++;continue;}}key.clear();key.add(codePoints[i]);if&(convertMap.containsKey(key))&{String&value&=&convertMap.get(key);if&(value&!=&null)&{result.append("[e]"&+&value&+&"[/e]");}continue;}result.append(Character.toChars(codePoints[i]));}return&result.toString();}
看到这里,你可能觉得懵了。当时我也是卡了两三天,不停的网上找资料,反编译别人的代码。最后才找的解决方案的,代码其实没有很多,最重要的是要怎么去思考。
4.渲染成图片。
public&static&SpannableStringBuilder&convetToHtml(String&content,&Context&mContext)&{String&regex&=&"\\[e\\](.*?)\\[/e\\]";Pattern&pattern&=&pile(regex);String&emo&=&"";Resources&resources&=&mContext.getResources();String&unicode&=&EmojiParser.getInstance(mContext).parseEmoji(content);Matcher&matcher&=&pattern.matcher(unicode);SpannableStringBuilder&sBuilder&=&new&SpannableStringBuilder(unicode);Drawable&drawable&=&null;ImageSpan&span&=&null;while&(matcher.find())&{emo&=&matcher.group();try&{int&id&=&resources.getIdentifier("emoji_"&+&emo.substring(emo.indexOf("]")&+&1,&emo.lastIndexOf("[")),"drawable",&"package");if&(id&!=&0)&{drawable&=&resources.getDrawable(id);drawable.setBounds(0,&0,&24,&24);span&=&new&ImageSpan(drawable);sBuilder.setSpan(span,&matcher.start(),&matcher.end(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}}&catch&(Exception&e)&{break;}}return&sB}
好了,成功解析出来了。但是!!你得先把图片弄到手啊,亲。而且还要我这个格式得。
额,话说这个我也是写了个java,把之前得softbank得命名转换成unified的命名,当初我还准备一个一个手动改来着,还好我同事一语点醒梦中人额。。不然我估计就吐血身亡了。程序写多了就是这样,思维固定了。。。
5.发emoji消息。
既然能显示了,你还得发啊,亲。
直接贴代码把,一个还原过程
public&static&String&convertToMsg(CharSequence&cs,&Context&mContext)&{SpannableStringBuilder&ssb&=&new&SpannableStringBuilder(cs);ImageSpan[]&spans&=&ssb.getSpans(0,&cs.length(),&ImageSpan.class);for&(int&i&=&0;&i&&&spans.&i++)&{ImageSpan&span&=&spans[i];String&c&=&span.getSource();int&a&=&ssb.getSpanStart(span);int&b&=&ssb.getSpanEnd(span);if&(c.contains("emoji"))&{ssb.replace(a,&b,&convertUnicode(c));}}ssb.clearSpans();return&ssb.toString();}private&static&String&convertUnicode(String&emo)&{emo&=&emo.substring(emo.indexOf("_")&+&1);if&(emo.length()&&&6)&{return&new&String(Character.toChars(Integer.parseInt(emo,&16)));}String[]&emos&=&emo.split("_");char[]&char0&=&Character.toChars(Integer.parseInt(emos[0],&16));char[]&char1&=&Character.toChars(Integer.parseInt(emos[1],&16));char[]&emoji&=&new&char[char0.length&+&char1.length];for&(int&i&=&0;&i&&&char0.&i++)&{emoji[i]&&=&char0[i];}for&(int&i&=&char0.&i&&&emoji.&i++)&{emoji[i]&&=&char1[i&-&char0.length];}return&new&String(emoji);}
由于时间跨度比较长了。年初得时候写得,基本都记不清了。所以尽量不要来问我额,亲们,我只提供解决方案。
代码我也会上传一份,有需要得可以拿去耍。
源代码:/course/20
个人辛苦劳动所得,请勿转载~
阅读(...) 评论()}

我要回帖

更多关于 nsstring emoji 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信