我正在从服务器接收以下格式的字符串:
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/

10-12 05:02