NSString+YYAdd的學(xué)習(xí)

圖片來(lái)之網(wǎng)絡(luò)

NSString的內(nèi)容好豐富啊,學(xué)習(xí)了很久很久,也補(bǔ)充了不熟悉的內(nèi)容。

算法了解

  • Hash算法: 將任意長(zhǎng)度的消息壓縮到某一固定長(zhǎng)度的消息摘要的函數(shù)。
  • MD5: 將消息運(yùn)算為一固定的長(zhǎng)度值,保證消息的完整性。 (Hash的一種)
  • HMAC: 秘鑰相關(guān)的哈希運(yùn)算消息認(rèn)證碼,以一個(gè)秘鑰和一個(gè)消息的輸入,生成一個(gè)消息摘要作為輸出。 (Hash的一種)
  • CRC: 循環(huán)冗余校驗(yàn)碼,一種數(shù)據(jù)傳輸檢錯(cuò)功能,對(duì)數(shù)據(jù)進(jìn)行多項(xiàng)式計(jì)算,并將得到的結(jié)果附在幀的后面,接受設(shè)備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸?shù)恼_性和完整性。
  • AES: 高級(jí)加密標(biāo)準(zhǔn)。

從來(lái)沒有研究過算法的具體細(xì)節(jié),直接copy一個(gè)代碼然后大功告成。

String添加char

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

NSString的方法真當(dāng)是多啊,很多沒有用到過,也沒研究過。

金額計(jì)算使用

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);

常常碰到計(jì)算金額的時(shí)候精度問題,最好的辦法是計(jì)算全部是服務(wù)器。如果要在本地就不要使用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編碼的字符串,強(qiáng)制轉(zhuǎn)化為其他的編碼類型時(shí),除了NSUnicodeStringEncoding,NSUTF16StringEncoding,NSUTF16BigEndianStringEncoding,NSUTF16LittleEndianStringEncoding,NSUTF32StringEncoding,NSUTF32BigEndianStringEncoding,NSUTF32LittleEndianStringEncoding返回為亂碼或空外,其他的編碼類型返回正常。

NSNEXTSTEPStringEncoding = 2,

8bit的ASCII碼的NEXTSTEP擴(kuò)展。
NEXTSTEP是喬布斯創(chuàng)立的公司,后來(lái)被蘋果公司收購(gòu)。應(yīng)該是為了兼容才添加了這個(gè)類型。

NSJapaneseEUCStringEncoding = 3,

8bit的EUC編碼,為日本文字提供兼容的一個(gè)編碼格式。

NSUTF8StringEncoding = 4,

Unicode的一種實(shí)現(xiàn)方案,8不是指使用8位來(lái)標(biāo)識(shí)文字,而是使用可變字節(jié),最多4個(gè)字節(jié)。特點(diǎn)是:不同范圍的字符使用不同長(zhǎng)度的編碼。
編碼規(guī)則:
Unicode編碼(16進(jìn)制)  ║ UTF-8 字節(jié)流(二進(jìn)制)  
000000 - 00007F  ║ 0xxxxxxx   
000080 - 0007FF  ║ 110xxxxx 10xxxxxx   
000800 - 00FFFF  ║ 1110xxxx 10xxxxxx 10xxxxxx   
010000 - 10FFFF  ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

編碼格式的檢測(cè):字節(jié)序標(biāo)志頭(文件前面的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的國(guó)際標(biāo)準(zhǔn)的拉丁文編碼。

NSSymbolStringEncoding = 6,

8bit的Adobe符號(hào)編碼矢量。

NSNonLossyASCIIStringEncoding = 7,

7bit的冗長(zhǎng)ASCII碼表示所有的Unicode字符。

NSShiftJISStringEncoding = 8, /* kCFStringEncodingDOSJapanese */

為日本文字提供兼容的,8bit的Shift-JIS編碼。
Shift-JIS是日本電腦系統(tǒng)最常用的編碼表。

NSISOLatin2StringEncoding = 9,

8bit的國(guó)際標(biāo)準(zhǔn)的拉丁文2編碼。

NSUnicodeStringEncoding = 10,

字符串對(duì)象的標(biāo)準(zhǔn)的Unicode編碼。

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

Windows系統(tǒng)的代碼頁(yè)1251,斯拉夫字母的字符編碼。與AdobeStandardCyrillic字體編碼等價(jià)。

CodePage(代碼頁(yè)),因?yàn)锳NSI編碼在每個(gè)國(guó)家都不統(tǒng)一,不兼容,可能導(dǎo)致沖突,所以在處理文字的時(shí)候,必須要告訴計(jì)算機(jī)你的ANSI是哪個(gè)國(guó)家和地圖的標(biāo)準(zhǔn),這個(gè)就叫代碼頁(yè)。

NSWindowsCP1252StringEncoding = 12, /* WinLatin1 */

Windows系統(tǒng)的代碼頁(yè)1252,等價(jià)于WinLatin1編碼。

NSWindowsCP1253StringEncoding = 13, /* Greek */

Windows系統(tǒng)的代碼頁(yè)1253,Greek字符編碼。

NSWindowsCP1254StringEncoding = 14, /* Turkish */

Windows系統(tǒng)的代碼頁(yè)1253,Turkish字符編碼。

NSWindowsCP1250StringEncoding = 15, /* WinLatin2 */

Windows系統(tǒng)的代碼頁(yè)1250,等價(jià)于WinLatin2編碼。

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

國(guó)際標(biāo)準(zhǔn)2022的日本電子郵件編碼。

NSMacOSRomanStringEncoding = 30,

經(jīng)典的Macintosh羅馬編碼。

Macintosh是蘋果公司生產(chǎn)的一種型號(hào)的計(jì)算機(jī)。

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

以16位無(wú)符號(hào)整數(shù)為單位。注意16位為一個(gè)單位,不表示一個(gè)字符就只有16位。絕大部分2個(gè)字節(jié),有些需要4個(gè)字節(jié)表示。

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

UTF-16的大字節(jié)字節(jié)序,高位在前,地位在后。

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

UTF-16的小字節(jié)字節(jié)序,低位在前,高位在后。

NSUTF32StringEncoding = 0x8c000100,

固定使用4個(gè)字節(jié)表示文字。

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

UTF-32的大字節(jié)字節(jié)序,高位在前,地位在后。

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

UTF-32的小字節(jié)字節(jié)序,低位在前,高位在后。

測(cè)試不同編碼的代碼

當(dāng)解碼的時(shí)候使用與編碼一樣的格式,那么都可以正常的解析。如果采用的普通的數(shù)字和字母,那么不同的解碼方式也可以得到正常的結(jié)果。

- (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");
}

總結(jié)

學(xué)習(xí)了所有的編碼格式后,Unicode才是王道,其他的小眾編碼已經(jīng)不再使用了。使用UTF-8,UTF-16使用的是最多的。在iOS開發(fā)的過程中,使用UTF-8是最多的。

stringByTrimmingCharactersInSet使用

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

返回一個(gè)將兩頭的空格和所有的換行符去除的新字符串。


使用了NSCharacterSet的使用:

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

一種字符集,包含Unicode一般類別Cc和Cf的字符.
Cc 為控制: 指示字符是控制代碼,其 Unicode 值是 U+007F,或者位于 U+0000 到 U+001F 或 U+0080 到 U+009F 范圍內(nèi)。
Cf 為格式:指示字符是格式字符,格式字符是通常不呈現(xiàn)的字符,但它影響文本布局或文本處理操作。

U+007F 為刪除符號(hào)。

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

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

Zs為空白字符,不具有標(biāo)志符號(hào),但不是控制或格式字符。

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

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

  • U+000A 換行
  • U+000B 垂直制表
  • U+000C 換頁(yè)
  • U+000D 回車
  • U+0085 下一行
@property (readonly, class, copy) NSCharacterSet *decimalDigitCharacterSet;

包含十進(jìn)制數(shù)字,即在范圍0到9內(nèi)。

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

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

  • Lu UppercaseLetter 大寫字母
  • LI LowercaseLetter 小寫字母
  • Lt TitlecaseLetter 詞首字母大寫字母
  • Lm ModifierLetter 修飾符字母。它是獨(dú)立式的間距字符,指示前面字母的修改。
  • Lo OtherLetter 字母。 它不是大寫字母,小寫字母,詞首字母大學(xué)或修飾符字母。
  • Mn NonSpacingMark 非間距字母。它是基字符的修改。
  • Mc SpacingCombiningMark 間距字符。 它是基字符的修改并影響該基字符的標(biāo)志符號(hào)的寬度。
  • Me EnclosingMark 封閉符號(hào)。它是非間距組合字符,環(huán)繞直到基字符(并包含基字符)的所有前面的字符。
@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 十進(jìn)制數(shù)字。 范圍0到9內(nèi)。
  • NI LetterNumber 字母表示的數(shù)字,而不是十進(jìn)制的數(shù)字,例如,羅馬數(shù)字5由字母“V”表示。
  • No OtherNumber 數(shù)字。它不是十進(jìn)制數(shù)字也不是字母數(shù)字,例如分?jǐn)?shù)1/2.
@property (readonly, class, copy) NSCharacterSet *decomposableCharacterSet;

在Unicode字符編碼標(biāo)準(zhǔn)3.2版本中,包含能夠代表字符序列組成的個(gè)別Unicode字符(例如口語(yǔ)字母),定義為標(biāo)準(zhǔn)分解。
這些字符兼容預(yù)組成字符。
注意在Unicode標(biāo)準(zhǔn)版本2.0中,不包含這些字符。

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

包含在分類Non-Characters中,或還沒有在Unicode標(biāo)準(zhǔn)版本3.2中定義。包含所有非法字符。

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

包含Unicode分類P*。

  • Pc ConnectorPunctuation 連接兩個(gè)字符的連接符標(biāo)點(diǎn)。
  • Pd DashPunctuation 短劃線或連字符。
  • Ps OpenPunctuation 成對(duì)的標(biāo)點(diǎn)符號(hào)(例如括號(hào),方括號(hào)和大括號(hào))之一的開始字符。
  • Pe ClosePunctuation 成對(duì)的標(biāo)點(diǎn)符號(hào)(例如括號(hào),方括號(hào)和大括號(hào))之一的封閉字符。
  • Pi InitialQuotePunctuation 開始或前引號(hào)。
  • Pf FinalQuotePunctuation 封閉或后引號(hào)。
  • Po OtherPunctuation 標(biāo)點(diǎn)。(以上的除外)
@property (readonly, class, copy) NSCharacterSet *capitalizedLetterCharacterSet;

包含Unicode分類Lt。

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

包含Unicode分類S*.

  • Sm MathSymbol 數(shù)學(xué)符號(hào),例如“+”或“=”
  • Sc CurrencySymbol 貨幣符號(hào)。
  • Sk ModifierSymbol 修飾符符號(hào),指示環(huán)繞字符的修改。例如,分?jǐn)?shù)斜線號(hào)指示其左側(cè)的數(shù)字為分子,右側(cè)的數(shù)字為分母。
  • So OtherSymbol 符號(hào)。(以上的除外)
@property (readonly, class, copy) NSCharacterSet *newlineCharacterSet

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

  • U+000A 換行
  • U+000B 垂直制表
  • U+000C 換頁(yè)
  • U+000D 回車
  • U+0085 下一行
  • U+2028 行分隔符
  • U+2029 章節(jié)分隔符

參考文章:

// END 發(fā)現(xiàn)這個(gè)文章有點(diǎn)長(zhǎng)了。 String真的是包含太多的內(nèi)容了,之前了解的只是皮毛啊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 字符集和編碼簡(jiǎn)介 在編程中常??梢砸姷礁鞣N字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說(shuō)...
    蘭山小亭閱讀 9,079評(píng)論 0 13
  • 余先生是近10來(lái)職業(yè)生涯中,少有的一直保持密切聯(lián)系的一位前輩。原因很簡(jiǎn)單,他值得尊敬! 【2】湖南常德 余先生 ...
    友思享閱讀 309評(píng)論 0 2
  • 地鐵里的冷氣開的很足 從冷冷清清的車廂 到擠滿人和行李 再到空無(wú)一人 也不需要太久 32個(gè)站點(diǎn)承載著千千萬(wàn)萬(wàn)的故事...
    討厭生活的懦夫閱讀 173評(píng)論 0 0
  • 秋天到,公園里金黃的落葉給大地媽媽穿上金黃的襯衫,讓大地媽媽甜甜地睡了,桂花的香味環(huán)繞著公園,讓綠草和鮮花美...
    大妞的簡(jiǎn)書閱讀 228評(píng)論 1 1
  • 親愛的兜, 今天你有3點(diǎn)讓我印象深刻。 1是你和爸爸商量好,如果你能在飯后半小時(shí)內(nèi)完成默寫,你就可以和爸爸一起玩半...
    蔡新花閱讀 171評(píng)論 0 0

友情鏈接更多精彩內(nèi)容