对于上下文,我正在开发的应用程序正在使用蓝牙UART连接,这就是我如何发现这个明显的问题。
使用" / r / n"结束我的消息时在考虑字符串的长度时,Swift会忽略换行符。我实际上可以添加一个SECOND换行符,但这会引入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
这里有些可疑的东西,我不知道为什么。
想法?
答案 0 :(得分:4)
"\r"
和"\r\n"
都算作单个“扩展Unicode字形
群集“,这就是str.count
计数(比较
斯威夫特的"Strings and Characters"
参考和Swift博客中的Strings in Swift 2。
如果您将字符串转换为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