• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Swift中的String和NSString 以及其编码方式的坑

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

String是swift语言中的字符类型

NSString是Foundation框架下的一个核心处理字符串的类 OC

随着Swift的快速更新 String 和 NSString 的差别越来越小了

首先两者可以通过在值后面加as 进行桥接转换的 

let str : String = "hello, world" as String

let str1 : NSString = str as NSString 

两者不同的是

 String:在操作String的子字符集时候只能使用String.Index 

let startIndex=str.startIndex

let Index=str.index(startIndex, offsetBy:5)

str[startIndex..<endIndex]

此时str 为"hello"

NSString:在操作NSString的子字符集的时候使用 Int整形就可以操作了 比较方便

str1.substring(from:5)

str1.substring(to:5)

编码方式的不同导致了操作的不同,其实用整形来操作 对于中文字符或者某些符号是不好的

注意这里:苹果官方文档上说到"CFString(NSString的底层) 代表了一个 Unicode 字符组成的数组...[Unicode] 标准定义了一个通用、统一的编码方案,其中每个字符 16 位。" 这里误导性很强,在OBJC中国期刊上可以看到 原作者已经出来声明。大家都知道现在Unicode是21位编码的,而这里又说NSString每个字符代表16位,这里说的Unicode是NSString 还在开发的时候(它最初是作为 Foundation Kit 的一部分在 1994 年发布的),Unicode 还是 16 位的!更广的范围和 UTF-16 的代理字符机制则是于 1996 年随着 Unicode 2.0 引入的。

要知道的是 NSString是采用UTF-16(16位) 码值编写 而String是使用现代Unicode(21位) 所以NSString对中文和表情符等操作可能不是那么友好

lettest1 :NSString="????????????"

lettest2 :String="????????????"

test1.length  //这里是6

//这里可以用format式 32位编码来解决表情包问题 因为NSString每位16位的 而表情包超出了16位 这时候打印出来就是3长度啦

NSString(format: "%lu", test1.length)

test2.characters.count //这里是3 

可见Swift 的unicode编码更加人性化 不会向用户展现底层character更多细节 java也是用unicode编码

注意 在swift中由于是采用unicode编码的 所以一个char可以存储16位数据(16bit = 2字节)所以一个char 存储一个汉字是没有问题的

let c : Character = "梁" 

如果在C想用 char c = '梁' 会报错误Character too large for enclosing character literal type

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[Swift]LeetCode200.岛屿的个数|NumberofIslands发布时间:2022-07-13
下一篇:
5.10 给类添加下标(subscript) [Swift原创教程]发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap