NSString+YYAdd的学习

图片来之网络

NSString的内容好丰富啊,学习了很久很久,也补充了不熟悉的内容。

算法了解

  • Hash算法: 将任意长度的消息压缩到某一固定长度的消息摘要的函数。
  • MD5: 将消息运算为一固定的长度值,保证消息的完整性。 (Hash的一种)
  • HMAC: 秘钥相关的哈希运算消息认证码,以一个秘钥和一个消息的输入,生成一个消息摘要作为输出。 (Hash的一种)
  • CRC: 循环冗余校验码,一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接受设备也执行类似的算法,以保证数据传输的正确性和完整性。
  • AES: 高级加密标准。

从来没有研究过算法的具体细节,直接copy一个代码然后大功告成。

String添加char

NSMutableString *result = [NSMutableString string];
unichar c = '2';
CFStringAppendCharacters((CFMutableStringRef)result, &c, 1);

NSString的方法真当是多啊,很多没有用到过,也没研究过。

金额计算使用

NSDecimalNumber *rest = [NSDecimalNumber decimalNumberWithString:@"2.12"];
NSLog(@"rest is %f", [rest floatValue]);
NSLog(@"rest is %f", [rest doubleValue]);
NSDecimalNumber *point = [NSDecimalNumber decimalNumberWithString:@"1.33"];
NSDecimalNumber *result = [rest decimalNumberBySubtracting:point];
NSLog(@"result is %@.", result);

常常碰到计算金额的时候精度问题,最好的办法是计算全部是服务器。如果要在本地就不要使用float和double了。

NSStringEncoding

typedef NSUInteger NSStringEncoding;
NS_ENUM(NSStringEncoding) {
    NSASCIIStringEncoding = 1,      /* 0..127 only */
    NSNEXTSTEPStringEncoding = 2,
    NSJapaneseEUCStringEncoding = 3,
    NSUTF8StringEncoding = 4,
    NSISOLatin1StringEncoding = 5,
    NSSymbolStringEncoding = 6,
    NSNonLossyASCIIStringEncoding = 7,
    NSShiftJISStringEncoding = 8,          /* kCFStringEncodingDOSJapanese */
    NSISOLatin2StringEncoding = 9,
    NSUnicodeStringEncoding = 10,
    NSWindowsCP1251StringEncoding = 11,    /* Cyrillic; same as AdobeStandardCyrillic */
    NSWindowsCP1252StringEncoding = 12,    /* WinLatin1 */
    NSWindowsCP1253StringEncoding = 13,    /* Greek */
    NSWindowsCP1254StringEncoding = 14,    /* Turkish */
    NSWindowsCP1250StringEncoding = 15,    /* WinLatin2 */
    NSISO2022JPStringEncoding = 21,        /* ISO 2022 Japanese encoding for e-mail */
    NSMacOSRomanStringEncoding = 30,

    NSUTF16StringEncoding = NSUnicodeStringEncoding,      /* An alias for NSUnicodeStringEncoding */

    NSUTF16BigEndianStringEncoding = 0x90000100,          /* NSUTF16StringEncoding encoding with explicit endianness specified */
    NSUTF16LittleEndianStringEncoding = 0x94000100,       /* NSUTF16StringEncoding encoding with explicit endianness specified */

    NSUTF32StringEncoding = 0x8c000100,                   
    NSUTF32BigEndianStringEncoding = 0x98000100,          /* NSUTF32StringEncoding encoding with explicit endianness specified */
    NSUTF32LittleEndianStringEncoding = 0x9c000100        /* NSUTF32StringEncoding encoding with explicit endianness specified */
};
NSASCIIStringEncoding = 1

ASCII码的值0...127。
按ASCII编码的字符串,强制转化为其他的编码类型时,除了NSUnicodeStringEncoding,NSUTF16StringEncoding,NSUTF16BigEndianStringEncoding,NSUTF16LittleEndianStringEncoding,NSUTF32StringEncoding,NSUTF32BigEndianStringEncoding,NSUTF32LittleEndianStringEncoding返回为乱码或空外,其他的编码类型返回正常。

NSNEXTSTEPStringEncoding = 2,

8bit的ASCII码的NEXTSTEP扩展。
NEXTSTEP是乔布斯创立的公司,后来被苹果公司收购。应该是为了兼容才添加了这个类型。

NSJapaneseEUCStringEncoding = 3,

8bit的EUC编码,为日本文字提供兼容的一个编码格式。

NSUTF8StringEncoding = 4,

Unicode的一种实现方案,8不是指使用8位来标识文字,而是使用可变字节,最多4个字节。特点是:不同范围的字符使用不同长度的编码。
编码规则:
Unicode编码(16进制)  ║ UTF-8 字节流(二进制)  
000000 - 00007F  ║ 0xxxxxxx   
000080 - 0007FF  ║ 110xxxxx 10xxxxxx   
000800 - 00FFFF  ║ 1110xxxx 10xxxxxx 10xxxxxx   
010000 - 10FFFF  ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

编码格式的检测:字节序标志头(文件前面的BOM头,可以判断编码格式)
UTF编码 ║ Byte Order Mark   
UTF-8 ║ EF BB BF   
UTF-16LE ║ FF FE   
UTF-16BE ║ FE FF   
UTF-32LE ║ FF FE 00 00   
UTF-32BE ║ 00 00 FE FF

NSISOLatin1StringEncoding = 5,

8bit的国际标准的拉丁文编码。

NSSymbolStringEncoding = 6,

8bit的Adobe符号编码矢量。

NSNonLossyASCIIStringEncoding = 7,

7bit的冗长ASCII码表示所有的Unicode字符。

NSShiftJISStringEncoding = 8, /* kCFStringEncodingDOSJapanese */

为日本文字提供兼容的,8bit的Shift-JIS编码。
Shift-JIS是日本电脑系统最常用的编码表。

NSISOLatin2StringEncoding = 9,

8bit的国际标准的拉丁文2编码。

NSUnicodeStringEncoding = 10,

字符串对象的标准的Unicode编码。

NSWindowsCP1251StringEncoding = 11, /* Cyrillic; same as AdobeStandardCyrillic */

Windows系统的代码页1251,斯拉夫字母的字符编码。与AdobeStandardCyrillic字体编码等价。

CodePage(代码页),因为ANSI编码在每个国家都不统一,不兼容,可能导致冲突,所以在处理文字的时候,必须要告诉计算机你的ANSI是哪个国家和地图的标准,这个就叫代码页。

NSWindowsCP1252StringEncoding = 12, /* WinLatin1 */

Windows系统的代码页1252,等价于WinLatin1编码。

NSWindowsCP1253StringEncoding = 13, /* Greek */

Windows系统的代码页1253,Greek字符编码。

NSWindowsCP1254StringEncoding = 14, /* Turkish */

Windows系统的代码页1253,Turkish字符编码。

NSWindowsCP1250StringEncoding = 15, /* WinLatin2 */

Windows系统的代码页1250,等价于WinLatin2编码。

NSISO2022JPStringEncoding = 21, /* ISO 2022 Japanese encoding for e-mail */

国际标准2022的日本电子邮件编码。

NSMacOSRomanStringEncoding = 30,

经典的Macintosh罗马编码。

Macintosh是苹果公司生产的一种型号的计算机。

NSUTF16StringEncoding = NSUnicodeStringEncoding, /* An alias for NSUnicodeStringEncoding */

以16位无符号整数为单位。注意16位为一个单位,不表示一个字符就只有16位。绝大部分2个字节,有些需要4个字节表示。

NSUTF16BigEndianStringEncoding = 0x90000100, /* NSUTF16StringEncoding encoding with explicit endianness specified */

UTF-16的大字节字节序,高位在前,地位在后。

NSUTF16LittleEndianStringEncoding = 0x94000100, /* NSUTF16StringEncoding encoding with explicit endianness specified */

UTF-16的小字节字节序,低位在前,高位在后。

NSUTF32StringEncoding = 0x8c000100,

固定使用4个字节表示文字。

NSUTF32BigEndianStringEncoding = 0x98000100, /* NSUTF32StringEncoding encoding with explicit endianness specified */

UTF-32的大字节字节序,高位在前,地位在后。

NSUTF32LittleEndianStringEncoding = 0x9c000100 /* NSUTF32StringEncoding encoding with explicit endianness specified */

UTF-32的小字节字节序,低位在前,高位在后。

测试不同编码的代码

当解码的时候使用与编码一样的格式,那么都可以正常的解析。如果采用的普通的数字和字母,那么不同的解码方式也可以得到正常的结果。

- (void)testStringEncoding
{
//    NSStringEncoding

    NSString *str = @"1234567890";
    NSData *data = [str dataUsingEncoding:NSASCIIStringEncoding];

    NSString *strEncoding1 = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    NSString *strEncoding2 = [[NSString alloc] initWithData:data encoding:NSNEXTSTEPStringEncoding];
    NSString *strEncoding3 = [[NSString alloc] initWithData:data encoding:NSJapaneseEUCStringEncoding];
    NSString *strEncoding4 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSString *strEncoding5 = [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding];
    NSString *strEncoding6 = [[NSString alloc] initWithData:data encoding:NSSymbolStringEncoding];
    NSString *strEncoding7 = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding];
    NSString *strEncoding8 = [[NSString alloc] initWithData:data encoding:NSShiftJISStringEncoding];
    NSString *strEncoding9 = [[NSString alloc] initWithData:data encoding:NSISOLatin2StringEncoding];
    NSString *strEncoding10 = [[NSString alloc] initWithData:data encoding:NSUnicodeStringEncoding];
    NSString *strEncoding11 = [[NSString alloc] initWithData:data encoding:NSWindowsCP1251StringEncoding];
    NSString *strEncoding12 = [[NSString alloc] initWithData:data encoding:NSISO2022JPStringEncoding];
    NSString *strEncoding13 = [[NSString alloc] initWithData:data encoding:NSMacOSRomanStringEncoding];
    NSString *strEncoding14 = [[NSString alloc] initWithData:data encoding:NSUTF16StringEncoding];
    NSString *strEncoding15 = [[NSString alloc] initWithData:data encoding:NSUTF16BigEndianStringEncoding];
    NSString *strEncoding16 = [[NSString alloc] initWithData:data encoding:NSUTF16LittleEndianStringEncoding];
    NSString *strEncoding17 = [[NSString alloc] initWithData:data encoding:NSUTF32StringEncoding];
    NSString *strEncoding18 = [[NSString alloc] initWithData:data encoding:NSUTF32BigEndianStringEncoding];
    NSString *strEncoding19 = [[NSString alloc] initWithData:data encoding:NSUTF32LittleEndianStringEncoding];

    NSLog(@"WOW");
}

总结

学习了所有的编码格式后,Unicode才是王道,其他的小众编码已经不再使用了。使用UTF-8,UTF-16使用的是最多的。在iOS开发的过程中,使用UTF-8是最多的。

stringByTrimmingCharactersInSet使用

- (NSString *)stringByTrim {
    NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
    return [self stringByTrimmingCharactersInSet:set];
}

返回一个将两头的空格和所有的换行符去除的新字符串。


使用了NSCharacterSet的使用:

@property (readonly, class, copy) NSCharacterSet *controlCharacterSet;

一种字符集,包含Unicode一般类别Cc和Cf的字符.
Cc 为控制: 指示字符是控制代码,其 Unicode 值是 U+007F,或者位于 U+0000 到 U+001F 或 U+0080 到 U+009F 范围内。
Cf 为格式:指示字符是格式字符,格式字符是通常不呈现的字符,但它影响文本布局或文本处理操作。

U+007F 为删除符号。

@property (readonly, class, copy) NSCharacterSet *whitespaceCharacterSet;

包含Unicode通用Zs和字符列表(U+0009),不包含新行或回车符。

Zs为空白字符,不具有标志符号,但不是控制或格式字符。

@property (readonly, class, copy) NSCharacterSet *whitespaceAndNewlineCharacterSet;

包含了Unicode的U+000A到U+000D和U+0085。

  • U+000A 换行
  • U+000B 垂直制表
  • U+000C 换页
  • U+000D 回车
  • U+0085 下一行
@property (readonly, class, copy) NSCharacterSet *decimalDigitCharacterSet;

包含十进制数字,即在范围0到9内。

@property (readonly, class, copy) NSCharacterSet *letterCharacterSet;

包含Unicode分类的L和M的所有字符。通常包含了所有的字母和象形文字。

  • Lu UppercaseLetter 大写字母
  • LI LowercaseLetter 小写字母
  • Lt TitlecaseLetter 词首字母大写字母
  • Lm ModifierLetter 修饰符字母。它是独立式的间距字符,指示前面字母的修改。
  • Lo OtherLetter 字母。 它不是大写字母,小写字母,词首字母大学或修饰符字母。
  • Mn NonSpacingMark 非间距字母。它是基字符的修改。
  • Mc SpacingCombiningMark 间距字符。 它是基字符的修改并影响该基字符的标志符号的宽度。
  • Me EnclosingMark 封闭符号。它是非间距组合字符,环绕直到基字符(并包含基字符)的所有前面的字符。
@property (readonly, class, copy) NSCharacterSet *lowercaseLetterCharacterSet;

包含Unicode分类的LI。通常包含所有小写的字母和象形文字。

@property (readonly, class, copy) NSCharacterSet *uppercaseLetterCharacterSet;

包含Unicode分类的Lu和Lt。通常包含所有大写的字母和象形文字。

@property (readonly, class, copy) NSCharacterSet *nonBaseCharacterSet;

包含Unicode分类的M*。

@property (readonly, class, copy) NSCharacterSet *alphanumericCharacterSet;

包含Unicode分类的L,M和N*。

  • Nd DecimalDigitNumber 十进制数字。 范围0到9内。
  • NI LetterNumber 字母表示的数字,而不是十进制的数字,例如,罗马数字5由字母“V”表示。
  • No OtherNumber 数字。它不是十进制数字也不是字母数字,例如分数1/2.
@property (readonly, class, copy) NSCharacterSet *decomposableCharacterSet;

在Unicode字符编码标准3.2版本中,包含能够代表字符序列组成的个别Unicode字符(例如口语字母),定义为标准分解。
这些字符兼容预组成字符。
注意在Unicode标准版本2.0中,不包含这些字符。

@property (readonly, class, copy) NSCharacterSet *illegalCharacterSet;

包含在分类Non-Characters中,或还没有在Unicode标准版本3.2中定义。包含所有非法字符。

@property (readonly, class, copy) NSCharacterSet *punctuationCharacterSet;

包含Unicode分类P*。

  • Pc ConnectorPunctuation 连接两个字符的连接符标点。
  • Pd DashPunctuation 短划线或连字符。
  • Ps OpenPunctuation 成对的标点符号(例如括号,方括号和大括号)之一的开始字符。
  • Pe ClosePunctuation 成对的标点符号(例如括号,方括号和大括号)之一的封闭字符。
  • Pi InitialQuotePunctuation 开始或前引号。
  • Pf FinalQuotePunctuation 封闭或后引号。
  • Po OtherPunctuation 标点。(以上的除外)
@property (readonly, class, copy) NSCharacterSet *capitalizedLetterCharacterSet;

包含Unicode分类Lt。

@property (readonly, class, copy) NSCharacterSet *symbolCharacterSet;

包含Unicode分类S*.

  • Sm MathSymbol 数学符号,例如“+”或“=”
  • Sc CurrencySymbol 货币符号。
  • Sk ModifierSymbol 修饰符符号,指示环绕字符的修改。例如,分数斜线号指示其左侧的数字为分子,右侧的数字为分母。
  • So OtherSymbol 符号。(以上的除外)
@property (readonly, class, copy) NSCharacterSet *newlineCharacterSet

包含新行的字符(U+000A~U+000D, U+0085, U+2028, U+2029),所有的新行字符。

  • U+000A 换行
  • U+000B 垂直制表
  • U+000C 换页
  • U+000D 回车
  • U+0085 下一行
  • U+2028 行分隔符
  • U+2029 章节分隔符

参考文章:

// END 发现这个文章有点长了。 String真的是包含太多的内容了,之前了解的只是皮毛啊。

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

推荐阅读更多精彩内容

  • 字符集和编码简介 在编程中常常可以见到各种字符集和编码,包括ASCII,MBCS,Unicode等字符集。确切的说...
    兰山小亭阅读 8,466评论 0 13
  • 余先生是近10来职业生涯中,少有的一直保持密切联系的一位前辈。原因很简单,他值得尊敬! 【2】湖南常德 余先生 ...
    友思享阅读 262评论 0 2
  • 地铁里的冷气开的很足 从冷冷清清的车厢 到挤满人和行李 再到空无一人 也不需要太久 32个站点承载着千千万万的故事...
    讨厌生活的懦夫阅读 132评论 0 0
  • 秋天到,公园里金黄的落叶给大地妈妈穿上金黄的衬衫,让大地妈妈甜甜地睡了,桂花的香味环绕着公园,让绿草和鲜花美...
    大妞的简书阅读 197评论 1 1
  • 亲爱的兜, 今天你有3点让我印象深刻。 1是你和爸爸商量好,如果你能在饭后半小时内完成默写,你就可以和爸爸一起玩半...
    蔡新花阅读 138评论 0 0