版本記錄
| 版本號 | 時間 |
|---|---|
| V1.0 | 2017.06.30 |
前言
前面我簡單的寫了些NSString的初始化,寫了幾篇,都不難,但是可以對新手有一定的小幫助,對于大神級人物可以略過這幾篇,NSString本來就沒有難的,都是細枝末節(jié),忘記了查一下就會了,沒有技術(shù)難點,下面我們繼續(xù)~~~
1. NSString簡單細說(一)—— NSString整體架構(gòu)
2. NSString簡單細說(二)—— NSString的初始化
3. NSString簡單細說(三)—— NSString初始化
4. NSString簡單細說(四)—— 從URL初始化
5. NSString簡單細說(五)—— 向文件或者URL寫入
6. NSString簡單細說(六)—— 字符串的長度
7. NSString簡單細說(七)—— 與C字符串的轉(zhuǎn)化
8. NSString簡單細說(八)—— 識別和比較字符串
9. NSString簡單細說(九)—— 字符串的合并
10. NSString簡單細說(十)—— 字符串的分解
11. NSString簡單細說(十一)—— 字符串的查找
12. NSString簡單細說(十二)—— 字符串的替換
13. NSString簡單細說(十三)—— 字符串的分行和分段
14. NSString簡單細說(十四)—— 字符串位置的計算
15. NSString簡單細說(十五)—— 字符串轉(zhuǎn)化為propertyList
16. NSString簡單細說(十六)—— 畫字符串
17. NSString簡單細說(十七)—— 字符串的折疊和前綴
18. NSString簡單細說(十八)—— 字符串中大小寫子母的變換
19. NSString簡單細說(十九)—— 根據(jù)映射獲取字符串
20. NSString簡單細說(二十)—— 獲取字符串的數(shù)值
這一篇我們說一下字符串與編碼。
字符串與編碼
一、+ (NSStringEncoding)stringEncodingForData:(NSData *)data encodingOptions:(NSDictionary<NSStringEncodingDetectionOptionsKey,id> *)opts convertedString:(NSString * _Nullable *)string usedLossyConversion:(BOOL *)usedLossyConversion;
下面我們看一下這幾個參數(shù)。

下面我們詳細說一下
- data:一個NSData對象,包含具有特定編碼方式的字節(jié)。
- opts:決定字符串編碼時使用的選項,是一個字典,其中鍵為NSStringEncodingDetectionOptionsKey。
NSStringEncodingDetectionSuggestedEncodingsKey
NSStringEncodingDetectionDisallowedEncodingsKey
NSStringEncodingDetectionUseOnlySuggestedEncodingsKey
NSStringEncodingDetectionAllowLossyKey
NSStringEncodingDetectionFromWindowsKey
NSStringEncodingDetectionLossySubstitutionKey
NSStringEncodingDetectionLikelyLanguageKey
- string:如果能夠決定一種字符串編碼,則會返回根據(jù)特定編碼由data轉(zhuǎn)化來的字符串對象。
- usedLossyConversion:是否使用有損轉(zhuǎn)化,如果一種字符串的編碼被確定,就會返回一種BOOL值,這個BOOL值與是否使用有損轉(zhuǎn)化有關(guān)。
-return:返回值為NSStringEncoding,或者如果字符串編碼不能確定的話就會返回0。
下面還是直接看代碼。
/**
* 1. + (NSStringEncoding)stringEncodingForData:(NSData *)data encodingOptions:(NSDictionary<NSStringEncodingDetectionOptionsKey,id> *)opts convertedString:(NSString * _Nullable *)string usedLossyConversion:(BOOL *)usedLossyConversion;
*
* @param data:An NSData object containing bytes in an encoding to be determined.
* @param opts:Options to use when attempting to determine the string encoding. See String Encoding Detection Options for a full list of supported options.
* @param string:If a string encoding could be determined, upon return contains an NSString object constructed from data using the determined string encoding.
* @param usedLossyConversion:If a string encoding could be determined, upon return contains a BOOL value corresponding to whether lossy conversion was used.
*
* @return:An NSStringEncoding value, or 0 if a string encoding could not be determined.
*
*/
const void *bytes = "ADDSDDSD";
BOOL isLossy = YES;
NSData *data = [NSData dataWithBytes:bytes length:5];
[NSString stringEncodingForData:data encodingOptions:NSStringEncodingDetectionAllowLossyKey convertedString:@"MMMMM" usedLossyConversion:&isLossy];
這個運行需要在MRC下使用,但是運行起來還是崩潰了,是下面這個問題,這個方法我還不怎么會,知道的請和我說下,謝謝。
** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString objectForKey:]: unrecognized selector sent to instance 0x108b22710'
結(jié)論:希望知道的@我。
二、- (BOOL)canBeConvertedToEncoding:(NSStringEncoding)encoding;
該方法會返回一個bool值,用來說明字符串是否可以進行無損轉(zhuǎn)換。
- 返回值:如果可以進行編碼無損轉(zhuǎn)化會返回YES,在轉(zhuǎn)化的過程中,如果字符要被改變或者刪除就會返回NO。如果你打算轉(zhuǎn)化字符串,方法
dataUsingEncoding:...失敗的時候會返回nil,可以避免提前調(diào)用這個方法失敗。
下面看代碼。
/**
* 2. - (BOOL)canBeConvertedToEncoding:(NSStringEncoding)encoding;
*
* @param encoding:A string encoding. For possible values, see NSStringEncoding.
*
* @return:YES if the receiver can be converted to encoding without loss of information. Returns NO if characters would have to be changed or deleted in the process of changing encodings.
*
*/
NSString *str = @"ABCDEFGHI";
BOOL isSuccess = [str canBeConvertedToEncoding:NSUTF8StringEncoding];
NSLog(@"isSuccess = %d",isSuccess);
下面看輸出結(jié)果。
2017-06-30 23:31:56.639 NSString你會用嗎?[1955:83829] isSuccess = 1
結(jié)論:這個方法還算簡單。
三、- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding;
這個方法返回的是一個根據(jù)給定編碼方式的NSData對象,本方法和dataUsingEncoding:allowLossyConversion:中第二個參數(shù)傳入NO是一樣的,下面看代碼。
/**
* 3. - (NSData *)dataUsingEncoding:(NSStringEncoding)encoding;
*
* @param encoding:A string encoding. For possible values, see NSStringEncoding.
*
* @return:The result of invoking dataUsingEncoding:allowLossyConversion: with NO as the second argument (that is, requiring lossless conversion).
*
*/
NSString *str = @"ABCDEFGHI";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"data = %@",data);
NSString *str1 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"str1 = %@",str1);
下面看輸出結(jié)果。
2017-06-30 23:43:53.368 NSString你會用嗎?[2123:92867] data = <41424344 45464748 49>
2017-06-30 23:43:53.369 NSString你會用嗎?[2123:92867] str1 = ABCDEFGHI
結(jié)論:這個方法也還好。
四、- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding allowLossyConversion:(BOOL)lossy;
下面看一下參數(shù)
- encoding:編碼方式,是一個枚舉值就不多說了。
- flag:如果是YES,則在轉(zhuǎn)換中允許字符串被移除和替換。
- return:包含特定編碼格式的NSData對象,如果標志位為NO,和不能進行無損轉(zhuǎn)化,例如重音符和大小寫,就會返回nil。
注意:如果標志位為YES,并且不能進行無損轉(zhuǎn)化時,一些字符串可能在轉(zhuǎn)換中被移除和替換,例如,在NSUnicodeStringEncoding和NSASCIIStringEncoding轉(zhuǎn)換中,字符‘á’ 會變成 ‘A’,失去重音。
下面還是看代碼。
/**
* 4. - (NSData *)dataUsingEncoding:(NSStringEncoding)encoding allowLossyConversion:(BOOL)lossy;
*
* @param encoding:A string encoding. For possible values, see NSStringEncoding.
*
* @return:The result of invoking dataUsingEncoding:allowLossyConversion: with NO as the second argument (that is, requiring lossless conversion).
*
*/
NSString *str = @"ABCDEFGHI";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *str1 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"str1 = %@",str1);
NSData *data1 = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
NSString *str2 = [[NSString alloc] initWithData:data1 encoding:NSUTF8StringEncoding];
NSLog(@"str2 = %@",str2);
下面看輸出結(jié)果
2017-06-30 23:56:42.384 NSString你會用嗎?[2259:102572] str1 = ABCDEFGHI
2017-06-30 23:56:42.385 NSString你會用嗎?[2259:102572] str2 = ABCDEFGHI
注意:自己看吧。
五、+ (NSString *)localizedNameOfStringEncoding:(NSStringEncoding)encoding;
該方法會根據(jù)某個編碼,返回一個人可讀的字符串。
下面看代碼。
/**
* 5. + (NSString *)localizedNameOfStringEncoding:(NSStringEncoding)encoding;
*
* @param encoding:A string encoding. For possible values, see NSStringEncoding.
*
* @return:A human-readable string giving the name of encoding in the current locale.
*
*/
NSString *str = @"ABCDEFGHI";
NSString *str1 = [NSString localizedNameOfStringEncoding:NSUTF8StringEncoding];
NSLog(@"str1 = %@",str1);
下面看結(jié)果
2017-07-01 00:01:48.972 NSString你會用嗎?[2344:107655] str1 = Unicode (UTF-8)
注意:這個好理解吧。
六、@property(readonly, copy) NSString *description;
該方法返回的是NSString對象。
下面直接看代碼。
/**
* 6.@property(readonly, copy) NSString *description;
*/
NSString *str1 = @"T中國helloChina";
NSString *str = str1.description;
下面看輸出結(jié)果。
2017-07-01 00:07:49.462 NSString你會用嗎?[2487:113889] str = T中國helloChina
注意:很簡單。
七、@property(readonly) NSStringEncoding fastestEncoding;
該方法會返回最快的編碼方式。該方法適用于字符串中字符的檢索,編碼方式對于空格可能不是有效的。
下面看代碼。
/**
* 7.@property(readonly) NSStringEncoding fastestEncoding;
*/
NSString *str1 = @"T中國helloChina";
NSStringEncoding code = str1.fastestEncoding;
NSLog(@"code = %d",code);
下面看輸出結(jié)果。
2017-07-01 00:09:53.333 NSString你會用嗎?[2532:116355] code = 10
下面看這個枚舉值
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 */
};
結(jié)論: NSUnicodeStringEncoding就是最快的編碼方式。
八、@property(readonly) NSStringEncoding smallestEncoding;
該編碼方式也許不是最快的獲取字符的方法,但是對空格有效的,這個屬性獲取字符時會消耗一段時間。
下面看代碼。
/**
* 8.@property(readonly) NSStringEncoding smallestEncoding;
*/
NSString *str1 = @"T中國helloChina";
NSStringEncoding code = str1.smallestEncoding;
NSLog(@"code = %d",code);
下面看輸出結(jié)果。
2017-07-01 00:19:58.240 NSString你會用嗎?[2663:123886] code = 10
結(jié)論:和七的方法返回的編碼方式是一樣的。
后記
未完,待續(xù)~~~
