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真的是包含太多的內容了,之前了解的只是皮毛啊。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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