我正在从服务器接收以下格式的字符串:118|...message...215|...message2...
基本上,它是消息长度,后跟一个管道和消息本身,对多个消息重复。消息编码为UTF16。
我在寻找一种用Swift来解析的方法。我知道我可以将其转换为NSString
并在其上使用标准索引/范围,因为UTF16是NSString使用的,但是我想知道处理这个问题的快速方法是什么?我似乎找不到基于UTF16编码从String
中提取子字符串的方法。
更新
我不想用原始的UTF16数据初始化String
(有很多方法可以做到这一点)。我已经有了这个字符串,所以我试着用上面的格式获取一个String
并解析它。我的问题是服务器给我的消息长度是基于UTF16的。我不能简单地提取长度并调用索引上的String.advance(messageLength)
,因为给定的长度与Swift前进的grapheme簇不匹配。我的问题是我不能用Swift从字符串中提取消息。我不得不把它转换成NSString
然后对它使用“normal”NSRange
。我的问题是,如何根据对第一个管道的搜索提取一个范围,然后使用UTF16中解析器提供的长度,从而拉出子字符串。
这对于NSString
来说非常简单。不知道如何才能做到纯粹的迅速(或如果它可以做到)。
最佳答案
以下是我对从字符串中解析消息的看法。我不得不改变你的长度来处理绳子。
let message = "13|...message...14|...message2..."
let utf16 = message.utf16
var startingIndex = message.utf16.startIndex
var travellingIndex = message.utf16.startIndex
var messages = [String]()
var messageLength: Int
while travellingIndex != message.utf16.endIndex {
// Start walking through each character
if let char = String(utf16[travellingIndex..<travellingIndex.successor()]) {
// When we find the pipe symbol try to parse out the message length
if char == "|" {
if let stringNumber = Int(String(utf16[startingIndex..<travellingIndex])) {
messageLength = stringNumber
// We found the lenght, now skip the pipe character
startingIndex = travellingIndex.successor()
// move the travelingIndex to the end of the message
travellingIndex = travellingIndex.advancedBy(messageLength)
// get the message and put it into an array
if let message = String(utf16[startingIndex...travellingIndex]) {
messages.append(message)
startingIndex = travellingIndex.successor()
}
}
}
}
travellingIndex = travellingIndex.successor()
}
print(messages)
最后得到的结果是:
["...message...", "...message2..."]
关于string - Swift UTF16子字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34141793/