作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
就上下文而言,我正在开发的应用程序正在使用蓝牙 UART 连接,这就是我发现这个明显问题的方式。
当我的消息以“/r/n”结束时,Swift 在考虑字符串的长度时会忽略换行符。我实际上可以添加第二个换行符,但这会引入 UART 错误。
这里有一些代码概述了我的问题:
var str = "Hey Apple"
print(str.count) //9
str += "\r" //"Hey Apple\r"
print(str.count) //10
str += "\n" //"Hey Apple\r\n"
print(str.count) //10
str += "\n" //"Hey Apple\r\n\n"
print(str.count) //11
var str2 = "Uh, hello?"
print(str2.count) //10
str2 += "\n" //"Uh, hello?\n"
print(str2.count) //11
str2 += "\n" //"Uh, hello?\n\n"
print(str2.count) //12
str2 += "\r" //"Uh, hello?\n\n\r"
print(str2.count) //13
这里有点可疑,我不知道为什么。
想法?
最佳答案
"\r"
和 "\r\n"
都算作一个“扩展的 Unicode 字素”cluster”,这就是 str.count
的计数(比较 "Strings and Characters"在 swift 引用和 Strings in Swift 2在 Swift 博客中)。
如果将字符串转换为 UTF-8 数据以便通过蓝牙发送并确定数据的实际长度
let data = Data(str.utf8)
let count = data.count // == str.utf8.count
然后一切都按预期工作:
var str = "Hey Apple"
print(Data(str.utf8) as NSData) // <48657920 4170706c 65>
print(Data(str.utf8).count) // 9
str += "\r" //"Hey Apple\r"
print(Data(str.utf8) as NSData) // <48657920 4170706c 650d>
print(Data(str.utf8).count) // 10
str += "\n" //"Hey Apple\r\n"
print(Data(str.utf8) as NSData) // <48657920 4170706c 650d0a>
print(Data(str.utf8).count) // 11
str += "\n" //"Hey Apple\r\n\n"
print(Data(str.utf8) as NSData) // <48657920 4170706c 650d0a0a>
print(Data(str.utf8).count) // 12
关于Swift Strings 似乎错误地处理了回车符和换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47566558/
我是一名优秀的程序员,十分优秀!