关于项目开发中涉及到输入表情的解决方案

通常情况下在后台服务器没有进行专门处理的情况下会返回异常,这时在前端就需要进行相应的处理。

1.限制输入表情

   通过一个专门的函数判断输入的文字中是否包含表情

在NSString+Extension的扩展类中加入该类方法

+ (BOOL)isContainsTwoEmoji:(NSString *)string

{

__block BOOL isEomji = NO;

[string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:

^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {

const unichar hs = [substring characterAtIndex:0];

//         NSLog(@"hs++++++++%04x",hs);

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)

{

isEomji = YES;

}

//                 NSLog(@"uc++++++++%04x",uc);

}

} else if (substring.length > 1) {

const unichar ls = [substring characterAtIndex:1];

if (ls == 0x20e3|| ls ==0xfe0f) {

isEomji = YES;

}

//             NSLog(@"ls++++++++%04x",ls);

} else {

if (0x2100 <= hs && hs <= 0x27ff && hs != 0x263b) {

isEomji = YES;

} else if (0x2B05 <= hs && hs <= 0x2b07) {

isEomji = YES;

} else if (0x2934 <= hs && hs <= 0x2935) {

isEomji = YES;

} else if (0x3297 <= hs && hs <= 0x3299) {

isEomji = YES;

} else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50|| hs == 0x231a ) {

isEomji = YES;

}

}

}];

return isEomji;

}

2.对输入的文字内容进行相应的编码,在接收到后台返回的数据时进行相对应的解码

编码

A:

//

//    NSString *encodedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)textView.text, (CFStringRef)@"!$&‘()*+,-./:;[email protected]_~%#[]", NULL, kCFStringEncodingUTF8));

B:

//    NSString *uniStr = [NSString stringWithUTF8String:[textView.text UTF8String]];

//    NSData *uniData = [uniStr dataUsingEncoding:NSNonLossyASCIIStringEncoding];

//    NSString *goodStr = [[NSString alloc] initWithData:uniData encoding:NSUTF8StringEncoding] ;

解码:

A:

NSString *showText = [serverString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

B:

//    const char *jsonString = [model.message UTF8String];   // goodStr 服务器返回的 json

//    NSData *jsonData = [NSData dataWithBytes:jsonString length:strlen(jsonString)];

//    NSString *goodMsg1 = [[NSString alloc] initWithData:jsonData encoding:NSNonLossyASCIIStringEncoding];

原文地址:https://www.cnblogs.com/fantasy940155655/p/8315480.html

时间: 2024-10-13 23:00:27

关于项目开发中涉及到输入表情的解决方案的相关文章

PHP开发中涉及到emoji表情的几种处理方法

最近几个月做微信开发比较多,存储微信昵称必不可少 可这万恶的微信支持emoji表情做昵称,这就有点蛋疼了 一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串.这是怎么回事呢? 原来是因为Mysql的utf8字符集是3字节的,而emoji是4字节,这样整个昵称就无法存储了.这要怎么办呢?我来介绍几种方法 1.使用utf8mb4字符集 如果你的mysql版本>=5.5.3,你大可直接将utf8直接升级为utf8mb4字符集

[转]PHP开发中涉及到emoji表情的三种处理方法

最近几个月做微信开发比较多,存储微信昵称必不可少,可这万恶的微信支持emoji表情做昵称,这就有点蛋疼了 一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串.这是怎么回事呢? 原来是因为Mysql的utf8字符集是3字节的,而emoji是4字节,这样整个昵称就无法存储了.这要怎么办呢?我来介绍几种方法 1.使用utf8mb4字符集 如果你的mysql版本>=5.5.3,你大可直接将utf8直接升级为utf8mb4字符集这

PHP开发中涉及到emoji表情的几种处理方法!

emoji表情 处理 一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串.这是怎么回事呢? 原来是因为Mysql的utf8字符集是3字节的,而emoji是4字节,这样整个昵称就无法存储了.这要怎么办呢?我来介绍几种方法 1.使用utf8mb4字符集 如果你的mysql版本>=5.5.3,你大可直接将utf8直接升级为utf8mb4字符集这种4字节的utf8编码可完美兼容旧的3字节utf8字符集,并且可以直接存储emoji

逆向思维在项目开发中真的很重要

最近一直和我的小组开发一个投资类型的网站,网站的整体已经完成得差不多了,客户今天突然提出了一个要求,希望能够在所有人退出当前聊天大厅后,后面进入的人不能够看到之前用户的聊天记录(原来是可以看到的).由于聊天室代码是别人写的,且基本算木有注释,也木有相关的文档.研究源码太耗时间了,由于聊天数据比较小,聊天室窗口是从messages表中读取的数据,所以打算当用户退出时,执行某一机制将Ajax_chat_messages表中对应聊天室的数据copy到一个新的Chat_messages表中,同时清除Aj

SSH项目开发中,将jsp页面放在WEB-INF的原因解析

 在一些安全型要求比较高的项目开发中,我们经常看到jsp页面都被放在WEB-INF下面了.这是出于对安全性的考虑, 是为了代码的安全.这样实现起来虽然麻烦了点,而且页面跳转很不方便.但是整个项目的安全性就提高上去了!所 以还是建议在一些安全性要求比较高的项目里使用这种做法! 这是我写的一个例子,我就是将所有的JSP页面都放在WEB-INF下面,然后按照模块进行分配,course文件夹就是放和 课程信息管理相关的JSP页面.假如我们输入https://localhost:8080/项目名称/p

项目开发中常用的PHP函数

日期操作 为了便于存储.比较和传递,我们通常需要使用strtotime()函数将日期转换成UNIX时间戳,只有在显示给用户看的时候才使用date()函数将日期转换成常用的时间格式. strtotime()  函数将任何英文文本的日期时间描述解析为 Unix 时间戳 eg: <?php echo(strtotime("now")); echo(strtotime("3 October 2005")); echo(strtotime("+5 hours&

在复杂的项目开发中使用结对编程

在复杂的项目开发中使用结对编程 卢占辉译 在开发软件项目时,不仅写出相应功能的模块很重要:确保写出的模块的易维护性(bug 修复,代码重构)也同样重要. 主打互联网技术和门户网站的Perpetuum 手机公司曾开展了一个长期的软件项目,以研制出一套基于web的内容管理软件.Perpetuum公司的许多开发者都参与了这个项目.项目中大部分复杂的模块都是完全靠个人开发的(非多人协作完成).维护这些模块(即非多人协作完成的模块)非常困难.因为开发某一模块的人还需要开发新的模块或者维护另一既有模块,这需

J2EE项目开发中好用的公共方法

在项目IDCM中涉及到多种工单,包括有:服务器|网络设备上下架工单.服务器|网络设备重启工单.服务器光纤网线更换工单.网络设备撤线布线工单.服务器|网络设备替换工单.服务器|网络设备RMA工单.通用原子工单.硬盘消磁折弯工单.物流工单.资产初入门工单.机柜上下电工单.待盘点|待盘盈工单等等.工单管理系统中要涉及到工单的创建|API创建和维护.所以有必要将一些通用的方法提出来,类似于模块化的架构涉及. 1.业务逻辑描述:在工单系统的详情页中,需要展示对工单的操作记录,所以做了通用的模块设计,这样当

项目开发中db设计

项目开发中db设计 0.根据原型分析出数据的由来和数据间的关系(实体关系); 1.提取字段,通过powerDesigner设计表; 2.先不加约束,先只建立数据上的单向关联,有需要时在建立双向关联或中间表;3.也可以先建立外键关系,最后删除外键关系;(方便查看表的关系);4.对实体对象通常会补充的字段:     id         主键    entity        关联实体/自己    isDelete varchar(1)  Null    #是否删除    CreateEmpId v