NSString+YYAdd的学习

2017-10-24  本文已影响73人  _阿南_
图片来之网络

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

算法了解

从来没有研究过算法的具体细节,直接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。

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

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

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

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

@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*。

@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*。

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

包含Unicode分类Lt。

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

包含Unicode分类S*.

@property (readonly, class, copy) NSCharacterSet *newlineCharacterSet

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

参考文章:

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

上一篇下一篇

猜你喜欢

热点阅读