Swift Strings似乎错误地处理了回车和换行

时间:2017-11-30 05:36:32

标签: swift bluetooth swift4

对于上下文,我正在开发的应用程序正在使用蓝牙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

这里有些可疑的东西,我不知道为什么。

想法?

1 个答案:

答案 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