当前位置: 首页 > news >正文

NSString学习

  1. 基本概念
    • NSString是以UTF-16 code uint的序列。所有的长度、字符、范围都是以16比特platform-endian(大端序小段序基于平台)的形式表示的。
      所以,一个英文字母的长度是1,一个汉字的长度也是1,而emoji表情的长度可能是2,3,4等等。
    • NSString可以从c缓冲区、NSdata对象以及NSUrl的内容中生成,也可以转化为这些内容。可以在ASCII、UTF-8、UTF-16、UTF-32以及其他编码格式之间转换。
  2. 关于字符
    • NSString的两个基本方法是- (unichar)characterAtIndex:(NSUInteger)index@property(readonly) NSUInteger length
    • 对于字符串的比较、查找等等都是以字符为基础的。也就是说比较时,是挨个字符(character)比较的。
    • unichar是UTF-16编码单位。typealias unichar = UInt16
  3. 解析UTF-16数据
    当解析UTF-16数据(也就是比特数组按照UTF-16的格式解析),如果没有BOM(byte-order mark)指定端序,那么默认是大端序。
  4. 子类、object composition与category
    • 实现NSString的子类,需要实现NSString的backing store(可以是静态数组、动态分配的数组或者其他的数据形式)、length方法与charAtIndex方法。
    • 另一个选择是声明一个类,将NSString作为一个属性,并将需要的其它的metadata也作为属性存储在类中。并实现需要用到的NSString的方法(其实就是调用这个类NSString属性的方法)及其他方法。
    • category。 对所有的NSString对象都会起作用,有时会有导致意想不到的效果。不过可以增加NSString的功能。
  5. 生成NSString的方法
    • 从比特数组中生成
      - (instancetype)initWithBytes:(const void *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding;
      从指定长度的比特数组中以指定的编码格式解析得到NSString。当len比比特数组的长度还长时,返回nil。
    • unichar数组中生成。
      - (instancetype)initWithCharacters:(const unichar *)characters length:(NSUInteger)length;
    • 从C字符串中的生成
      - (instancetype)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
      由于C字符串是以NULL终结的,所以字符串中不能有NULL。所以编码格式只能是8比特为基础的,因为比8比特宽的字符格式(比如UTF-16),一个编码单位可能有NULL比特。
    • 从参数创建
      - (instancetype)initWithFormat:(NSString *)format locale:(id)locale arguments:(va_list)argList;
    • 从NSData创建
      - (instancetype)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding;
      data中,按照encoding解析,得到UTF-16的code unit序列。
    • 从文件中创建
      • 以指定编码格式创建
        - (instancetype)initWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError * _Nullable *)error;
        如果文件打不开或者编码错误,返回nil。
      • 从文件中创建,并返回解析用的编码格式 - (instancetype)initWithContentsOfFile:(NSString *)path usedEncoding:(NSStringEncoding *)enc error:(NSError * _Nullable *)error;
        编码格式以指针方式返回。
    • 从URL中创建
      • 以指定编码格式创建
        - (instancetype)initWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError * _Nullable *)error;
      • 返回解析用的编码格式
        - (instancetype)initWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError * _Nullable *)error;
  6. 写到文件或URL中

    • 写到文件中
      - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError * _Nullable *)error;
      如果useAuxiliaryFileYES,那么会生成一个临时的文件,把String写到这个文件中,然后将这个文件重命名为目标文件。这保证了及时系统crash,也不会导致已存在的文件(如果存在)会损坏。
      这个方法把编码信息存储在文件的扩展属性中,名字是com.apple.TextEncodin,值是编码的IANA名字+分号+编码格式的CFStringEncoding值。从文件里生成字符串时,也是用这些个信息来决定编码格式的。例如
      • MACINTOSH;0
      • UTF-8;134217984
      • UTF-8;
      • ;3071
    dd = @"d";
    NSString *file = [NSHomeDirectory() stringByAppendingPathComponent:@"test"];
    NSError *error = nil;
    [dd writeToFile:file atomically:YES encoding:NSUTF8StringEncoding error:&error];
    if (nil == error)
    {
        NSLog(@"write success");
    }
    
    NSDictionary *attrbuteDict = [[NSFileManager defaultManager] attributesOfItemAtPath:file error:&error];
    NSDictionary *extendAtt = [attrbuteDict objectForKey:@"NSFileExtendedAttributes"];
    
    NSData *attrData = [extendAtt objectForKey:@"com.apple.TextEncoding"];
    NSString *attrStr = [[NSString alloc] initWithData:attrData encoding:NSUTF8StringEncoding];
    


    - 写到URL中去

    - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError * _Nullable *)error;

  7. 获取长度

    • 获取UTF-16 code unit长度
      @property(readonly) NSUInteger length。不是打印出来字符的长度。
    • 使用某种编码格式编码,比特数组的长度。
      - (NSUInteger)lengthOfBytesUsingEncoding:(NSStringEncoding)enc; 时间复杂度O(n) d
    • 使用某种格式编码,比特数组的不精确上界。
      - (NSUInteger)maximumLengthOfBytesUsingEncoding:(NSStringEncoding)enc;。时间复杂度O(1).
  8. 获取UTF-16编码单位的数组

    • - (void)getCharacters:(unichar *)buffer range:(NSRange)range;
      buffer必须足够大。
    • - (BOOL)getBytes:(void *)buffer maxLength:(NSUInteger)maxBufferCount usedLength:(NSUInteger *)usedBufferCount encoding:(NSStringEncoding)encoding options:(NSStringEncodingConversionOptions)options range:(NSRange)range remainingRange:(NSRangePointer)leftover;
      这个方法不会crash。
  9. 获取C字符串(以NULL结尾的字符串)
    调用之前先使用- (BOOL)canBeConvertedToEncoding:(NSStringEncoding)encoding;方法确定是否可以无失真的编码。

    这些方法都不要调用UTF-16,UTF-32编码格式,因为这些包括NULL字节。

    • - (const char *)cStringUsingEncoding:(NSStringEncoding)encoding;
      这个字符串会在调用者被dealloc之前有效,delloc之后无效。
    • - (BOOL)getCString:(char *)buffer maxLength:(NSUInteger)maxBufferCount encoding:(NSStringEncoding)encoding;
      buffer需要自己分配内存,因此生命周期自己控制。
  10. 字符串的比较

    • - (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToCompare locale:(id)locale;
      比较字符串时的选项
      • NSCaseInsensitiveSearch
      • NSLiteralSearch
      • NSBackwardsSearch
      • NSAnchoredSearch
      • NSNumericSearch
      • NSDiacriticInsensitiveSearch
      • NSWidthInsensitiveSearch
      • NSForcedOrderingSearch
      • NSRegularExpressionSearch
    • 前缀后缀
      • - (BOOL)hasSuffix:(NSString *)str;
      • - (BOOL)hasSuffix:(NSString *)str;
    • 是否相同
      - (BOOL)isEqualToString:(NSString *)aString;
      这个方法比isEqual:方法要快一些。
  11. 组合字符串

    • stringByAppendingFormat:
    • - (NSString *)stringByPaddingToLength:(NSUInteger)newLength withString:(NSString *)padString startingAtIndex:(NSUInteger)padIndex;
      padStringpadIndex开始填充。
      • [@"abc" stringByPaddingToLength: 9 withString: @"." startingAtIndex:0]; // Results in "abc......"
      • [@"abc" stringByPaddingToLength: 2 withString: @"." startingAtIndex:0]; // Results in "ab"
      • [@"abc" stringByPaddingToLength: 9 withString: @". " startingAtIndex:1]; // Results in "abc . . ."
        // Notice that the first character in the padding is " "。因为@". "的charAtIndex:1是" "。
  12. 分隔字符串

    • 根据分隔符生成数组。
      • - (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
      • - (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator;
    • 去掉字符串前后的指定字符
      • - (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
    • 取字符串的一部分
      - (NSString *)substring***类的方法
  13. 查找字符串

    • 字符查找
      - (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch;
    • 字符串查找
      - (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch locale:(NSLocale *)locale;
    • 按行枚举
      - (void)enumerateLinesUsingBlock:(void (^)(NSString *line, BOOL *stop))block;
    • 按照NSStringEnumerationOptions枚举
      - (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block;
      常见的NSStringEnumerationOptions
      • NSStringEnumerationByLines
      • NSStringEnumerationByParagraphs(段落分隔符是什么)
      • NSStringEnumerationByComposedCharacterSequences 一个emoji表情包括若干UTF6 code unit,这个可以按照emoji表情来枚举。
      • NSStringEnumerationByWords
      • NSStringEnumerationBySentences
      • NSStringEnumerationReverse(反向)
      • NSStringEnumerationSubstringNotRequired(不会有substring传入到block中,出于性能考虑)
      • NSStringEnumerationLocalized
  14. 字符串替换

    • `- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement options:(NSStringCompareOptions)options range:(NSRange)searchRange;
  15. 分行和分页

    • 分行符
      • U+000A Unicode Character 'LINE FEED (LF)' (\n)
      • U+000D Unicode Character 'CARRIAGE RETURN (CR)' (\r)
      • U+0085 Unicode Character 'NEXT LINE (NEL)'
      • U+2028 Unicode Character 'LINE SEPARATOR'
      • U+2029 Unicode Character 'PARAGRAPH SEPARATOR'\r\n, in that order (also known as CRLF)
    • 分段符
      • ?????
  16. ComposedCharacter

    我理解就是由多个UTF16 code unit表示的字符。为了避免被截断,需要确定包含指定index的完整的ComposedCharacter。
    - (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)index;

  17. 确定String在屏幕上的大小

    - (CGSize)sizeWithAttributes:(NSDictionary<NSString *,id> *)attrs;

    这个函数返回的包括小数,因此需要对返回值调用ceil函数。

  18. stringByFoldingWithOptions:locale????

  19. 找到共同的前缀

    - (NSString *)commonPrefixWithString:(NSString *)str options:(NSStringCompareOptions)mask;

  20. 编码相关

    • 是否可以以某种形式无失真编码
      - (BOOL)canBeConvertedToEncoding:(NSStringEncoding)encoding;
    • 根据NSData来探测这个NSData的编码格式
      + (NSStringEncoding)stringEncodingForData:(NSData *)data encodingOptions:(NSDictionary<NSStringEncodingDetectionOptionsKey,id> *)opts convertedString:(NSString * _Nullable *)string usedLossyConversion:(BOOL *)usedLossyConversion;
      探测编码格式时的选项String Encoding Detection Options
      • suggestedEncodingsKey
        建议探测的编码格式。是NSSNumebr的数组。会优先考虑这些编码格式。
      • disallowedEncodingsKey
        不允许的编码格式。是NSNumber的数组。
      • useOnlySuggestedEncodingsKey
        是否只允许探测建议的编码格式。
      • allowLossyKey
        是否允许失真解码。
      • fromWindowsKey
        是否考虑Windows编码格式
      • lossySubstitutionKey
        失真解码下,不支持的字符被什么替代。是一个NSString对象,默认是U+FFFD
      • likelyLanguageKey
        NSdata可能来来源语言。two-letter ISO 639-1 language code,NSString对象。
    • 转化为NSData
      - (NSData *)dataUsingEncoding:(NSStringEncoding)encoding allowLossyConversion:(BOOL)lossy;
    • 无失真编码下的最快编码格式
      @property(readonly) NSStringEncoding fastestEncoding;
    • 无失真编码格式下占用空间最小的格式
      @property(readonly) NSStringEncoding smallestEncoding
  21. URL相关

    • URL编码
      - (NSString *)stringByAddingPercentEncodingWithAllowedCharacters:(NSCharacterSet *)allowedCharacters;
    • 去除URL编码
      @property(readonly, copy) NSString *stringByRemovingPercentEncoding;
  22. 文件路径相关

    • 把字符串用路径分隔符连接起来
      class func path(withComponents components: [String]) -> String
    • 把路径用分隔符分隔,得到数组
      var pathComponents: [String] { get }
    • 把路径表示成系统形式的c字符串

      @property(readonly) const char *fileSystemRepresentation;

      char filenameBuffer[13];
      BOOL success;
      success = [@"/mach_kernel"  getFileSystemRepresentation:filenameBuffer maxLength:12];
      // success == NO
      // Changing the length to include the NULL character does work
      success = [@"/mach_kernel" getFileSystemRepresentation:filenameBuffer maxLength:13];
      // success == YES
      
    • 获取最后一个路径名字

      @property(readonly, copy) NSString *lastPathComponent;

    • 路径扩展名

      @property(readonly, copy) NSString *pathExtension;

    • 处理~

      • ~扩展为绝对路径
        @property(readonly, copy) NSString*stringByExpandingTildeInPath;
      • 绝对路径缩写~
        @property(readonly, copy) NSString *stringByAbbreviatingWithTildeInPath;
    • 在路径名后加子路径

      - (NSString *)stringByAppendingPathComponent:(NSString *)str;

    • 路径后加后缀

      - (NSString *)stringByAppendingPathExtension:(NSString *)str;

    • 删除最后一段路径

      @property(readonly, copy) NSString *stringByDeletingLastPathComponent;

    • 删除路径后缀

      @property(readonly, copy) NSString *stringByDeletingPathExtension;

    • 解析符号链接(快捷方式)

      @property(readonly, copy) NSString *stringByResolvingSymlinksInPath;

    • 标准化路径

      @property(readonly, copy) NSString *stringByStandardizingPath;

      • 扩展~号为绝对路径
      • 如果可以,移除起始的“/private/var/automount”, “/var/automount”“/private”
      • 处理///./
      • 移除最后一个路径段的尾斜线
      • 处理符号链接如../
  23. 更多知识

    • 字符编码笔记:ASCII,Unicode和UTF-8

转载于:https://www.cnblogs.com/huahuahu/p/NSString-xue-xi.html

相关文章:

  • 在 CentOS7 上将自定义的 jar 包注册为 linux 服务 service
  • 盒模型基本概念
  • unity ugui消息透传
  • 转:FIFO和DMA
  • TCP确认延时和Nagle算法
  • Lua初学习 9-14_01 数据结构 --- 链表list (同名table)
  • 线程的共享资源和私有资源
  • Code[VS] 1022 覆盖 题解
  • Q: ossfs挂载时如何设置权限?
  • 拷贝(复制)构造函数和赋值函数
  • MFC静态分割后锁定分隔条/限制分隔条的移动范围 方法1
  • 异常 ORA-00257: archiver error. Connect internal only, until freed
  • 判断32位整数二进制中1的个数的算法
  • json化 datatable
  • 乐视云视频 接口开发 结合百度编辑器
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 〔开发系列〕一次关于小程序开发的深度总结
  • JS学习笔记——闭包
  • Making An Indicator With Pure CSS
  • windows下使用nginx调试简介
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 构建二叉树进行数值数组的去重及优化
  • 日剧·日综资源集合(建议收藏)
  • 如何选择开源的机器学习框架?
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 使用SAX解析XML
  • 推荐一个React的管理后台框架
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 一、python与pycharm的安装
  • 最简单的无缝轮播
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​插件化DPI在商用WIFI中的价值
  • #QT(TCP网络编程-服务端)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (一)u-boot-nand.bin的下载
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)大道至简,职场上做人做事做管理
  • (转)关于多人操作数据的处理策略
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net6Api后台+uniapp导出Excel
  • /etc/fstab 只读无法修改的解决办法
  • @RequestMapping处理请求异常
  • [ C++ ] STL---stack与queue
  • [2544]最短路 (两种算法)(HDU)