一个实用的NSString分类工具(二) —— 获取拼音大写首字母和转义等

版本记录

版本号 时间
V1.0 2017.12.16

前言

NSString是我们经常使用的一个类,但是苹果的API很多用起来不是那么方便,需要根据我们特殊需求进行个性化的改变和定制,接下来,我就写一个NSString分类工具,以后在使用的时候直接调用这个分类中的方法,可以实现很多小的功能,用起来也很方便。相关代码已经上传至GitHub - 刀客传奇。感兴趣的可以看我上面写的几篇。
1. 一个实用的NSString分类工具 (一)—— 玩转数字

获取拼音首字母

获取拼音的首字母,看着简单好像取第一个字符就可以,但是要考虑很多情况,比如说声调正好在首位怎么办?下面我们看一下代码。

//获取拼音的首字母

- (NSString *)jj_gainPinYinFirstCharacter;
//获取拼音的首字母

- (NSString *)jj_gainPinYinFirstCharacter
{
    //转成了可变字符串
    NSMutableString *str = [NSMutableString stringWithString:self];
    
    //先转换为带声调的拼音
    CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
    
    //再转换为不带声调的拼音
    CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);
    
    //转化为大写拼音
    NSString *pinYin = [str capitalizedString];
    
    //获取并返回首字母
    return [pinYin substringToIndex:1];
}

下面看一下调用

//获取拼音首字母

- (void)gainPinYinFirstChracter
{
    NSString *str = @"womendejia";
    NSString *result = [str jj_gainPinYinFirstCharacter];
    NSLog(@"result = %@", result);
    
    NSString *str1 = @"ǎi";
    NSString *result1 = [str1 jj_gainPinYinFirstCharacter];
    NSLog(@"result1 = %@", result1);
}

看一下输出结果

2017-12-16 09:30:47.665652+0800 JJNSStringTool[902:17277] result = W
2017-12-16 09:30:47.669444+0800 JJNSStringTool[902:17277] result1 = A

另一种计算多行字符串占有的尺寸

还是先看代码。

//获取多行文字的宽高

- (CGSize)jj_sizeWithFont:(UIFont *)font andMaxSize:(CGSize)maxSzie;
//获取多行文字的宽高

- (CGSize)jj_sizeWithFont:(UIFont *)font andMaxSize:(CGSize)maxSzie
{
    if (![font isKindOfClass:[UIFont class]]) {
        font = [UIFont systemFontOfSize:13];
    }
    if (NSFontAttributeName == nil || font == nil) {
        return CGSizeZero;
    }
    NSDictionary *atte = @{NSFontAttributeName : font};
    return  [self boundingRectWithSize:maxSzie options:NSStringDrawingUsesLineFragmentOrigin attributes:atte context:nil].size;
}

下面我们就看一下调用

- (void)calculateMultiLineSize
{
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100.0, 100.0, 250, 500)];
    label.backgroundColor = [UIColor blueColor];
    label.text = @"这是什么鬼👻☺这是什么鬼👻☺这是什么鬼👻☺这是什么鬼👻☺这是什么鬼👻☺这是什么鬼👻☺这是什么鬼👻☺这是什么鬼👻☺";
    label.numberOfLines = 0;
    [label sizeToFit];
    [self.view addSubview:label];
    
    CGSize size = [label.text jj_sizeWithFont:[UIFont systemFontOfSize:20.0] andMaxSize:CGSizeMake(250, MAXFLOAT)];
    NSLog(@"%lf --- %lf", size.width, size.height);
}

看一下输出结果

2017-12-16 09:45:28.169732+0800 JJNSStringTool[1091:27948] 242.660000 --- 143.203125

验证弱密码

还是先看代码

//密码太弱

- (BOOL)jj_isPasswordWeak;
//密码太弱

- (BOOL)jj_isPasswordWeak
{
    if ([self isEqualToString:@"112233"] ||
        [self isEqualToString:@"123123"] ||
        [self isEqualToString:@"123321"] ||
        [self isEqualToString:@"abcabc"] ||
        [self isEqualToString:@"abc123"] ||
        [self isEqualToString:@"a1b2c3"] ||
        [self isEqualToString:@"aaa111"] ||
        [self isEqualToString:@"123qwe"] ||
        [self isEqualToString:@"qweasd"] ||
        [self isEqualToString:@"admin"]  ||
        [self isEqualToString:@"password"] ||
        [self isEqualToString:@"p@ssword"] ||
        [self isEqualToString:@"passwd"] ||
        [self isEqualToString:@"iloveyou"] ||
        [self isEqualToString:@"5201314"]||
        [self isEqualToString:@"asdfghjkl"]||
        [self isEqualToString:@"qwerty"]) {
        return YES;
    }
    NSString *CT_NUM = @"^(0{6,16})|(1{6,16})|(2{6,16})|(3{6,16})|(4{6,16})|(5{6,16})|(6{6,16})|(7{6,16})|(8{6,16})|(9{6,16})|(a{6,16})|(b{6,16})|(c{6,16})|(d{6,16})|(e{6,16})|(f{6,16})|(g{6,16})|(h{6,16})|(i{6,16})|(j{6,16})|(k{6,16})|(l{6,16})|(m{6,16})|(n{6,16})|(o{6,16})|(p{6,16})|(q{6,16})|(r{6,16})|(s{6,16})|(t{6,16})|(u{6,16})|(v{6,16})|(w{6,16})|(x{6,16})|(y{6,16})|(z{6,16})|(A{6,16})|(B{6,16})|(C{6,16})|(D{6,16})|(E{6,16})|(F{6,16})|(G{6,16})|(H{6,16})|(I{6,16})|(J{6,16})|(K{6,16})|(L{6,16})|(M{6,16})|(N{6,16})|(O{6,16})|(P{6,16})|(Q{6,16})|(R{6,16})|(S{6,16})|(T{6,16})|(U{6,16})|(V{6,16})|(W{6,16})|(X{6,16})|(Y{6,16})|(Z{6,16})$";//
    NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT_NUM];
    BOOL isMatch1 = [pred1 evaluateWithObject:self];
    if (isMatch1==YES) {
        return YES;
    }
    NSString *model = @"0123456789";
    NSString *alphe = @"abcdefghijklmnopqrstuvwxyz";
    NSString *alphe2 = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if ([model rangeOfString:self].location != NSNotFound) {
        return YES;
    }
    
    if ([alphe rangeOfString:self].location != NSNotFound) {
        return YES;
    }
    
    if ([alphe2 rangeOfString:self].location != NSNotFound) {
        return YES;
    }
    return NO;
}

下面我们就调用一下

//密码太弱

- (void)evaluateWeakPassword
{
    NSString *str = @"123456";
    BOOL result = [str jj_isPasswordWeak];
    NSLog(@"result = %d", result);
    
    NSString *str1 = @"eoowehohowh";
    BOOL result1 = [str1 jj_isPasswordWeak];
    NSLog(@"result1 = %d", result1);
}

看输出结果

2017-12-16 09:53:52.298812+0800 JJNSStringTool[1268:33541] result = 1
2017-12-16 09:53:52.300740+0800 JJNSStringTool[1268:33541] result1 = 0

URL转义

这个大家很熟悉了,但是还是给大家列了出来。还是直接看代码。

//URL转义

- (NSURL *)jj_encodeURL;
//URL 转义

- (NSURL *)jj_encodeURL
{
    NSString *collectUrl = [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSString *urlEncodeString = [collectUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:urlEncodeString];
    return url;
}

下面我们调用一下

// URL 转义

- (void)encodeURL
{
    NSString *str = @"http://www.baidu.com?a=我的家";
    NSURL *result = [str jj_encodeURL];
    NSLog(@"result = %@", result);
    
    NSString *str1 = @"http://www.baidu.com?a=b";
    NSURL *result1 = [str1 jj_encodeURL];
    NSLog(@"result1 = %@", result1);
}

看一下输出结果

2017-12-16 10:13:54.158231+0800 JJNSStringTool[1455:45285] result = http://www.baidu.com?a=%E6%88%91%E7%9A%84%E5%AE%B6
2017-12-16 10:13:54.158519+0800 JJNSStringTool[1455:45285] result1 = http://www.baidu.com?a=b

字符串的转义

先看一下代码

- (NSString *)jj_encodedString;
- (NSString *)jj_encodedString
{
    NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR("!*'();:@&=+$,/?%#[]"), kCFStringEncodingUTF8));
    return result;
}

下面调用一下

- (void)encodeString
{
    NSString *str = @"womendejia";
    NSString *result = [str jj_encodedString];
    NSLog(@"result = %@", result);
    
    NSString *str1 = @"ode家";
    NSString *result1 = [str1 jj_encodedString];
    NSLog(@"result1 = %@", result1);
}

下面看输出结果

2017-12-16 10:22:32.906892+0800 JJNSStringTool[1570:49951] result = womendejia
2017-12-16 10:22:32.907132+0800 JJNSStringTool[1570:49951] result1 = ode%E5%AE%B6

字符串转义解码

下面我们就还原到转义前的字符串。

- (NSString *)jj_decodedString;
- (NSString *)jj_decodedString
{
    NSString *result = CFBridgingRelease(CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (CFStringRef)self, CFSTR(""), kCFStringEncodingUTF8));
    return result;
}

下面我们就调用一下

- (void)decodeString
{
    NSString *str = @"womendejia";
    NSString *result = [str jj_decodedString];
    NSLog(@"result = %@", result);
    
    NSString *str1 = @"ode%E5%AE%B6";
    NSString *result1 = [str1 jj_decodedString];
    NSLog(@"result1 = %@", result1);
}

下面看输出结果

2017-12-16 10:34:50.994303+0800 JJNSStringTool[1726:56128] result = womendejia
2017-12-16 10:34:50.994607+0800 JJNSStringTool[1726:56128] result1 = ode家

后记

未完,待续~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,348评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,122评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,936评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,427评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,467评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,785评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,931评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,696评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,141评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,483评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,625评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,291评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,892评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,492评论 2 348

推荐阅读更多精彩内容