2

我有这个函数可以在特定单词处返回(并寻找)一个 FileHandle 指针:

func getFilePointerIndex(atWord word: String, inFile file: FileHandle) -> UInt64? {
    let offset = file.offsetInFile
    if let str = String(data: file.readDataToEndOfFile(), encoding: .utf8) {
        if let range = str.range(of: word) {
            let intIndex = str.distance(from: str.startIndex, to: range.lowerBound)
            file.seek(toFileOffset: offset + UInt64(intIndex))
            return UInt64(intIndex) + offset
        }
    }
    return nil
}

当应用于某些 utf8 文本文件时,它会产生远离传入单词位置的偏移结果。我认为它必须是字符编码(可变字节字符),因为 seek(toFileOffset:) 方法适用于类 Data对象。

有什么想法可以解决吗?

4

1 回答 1

1
let intIndex = str.distance(from: str.startIndex, to: range.lowerBound)

测量以 s 为单位的距离Character,即“扩展的 Unicode 字素簇”。例如,字符“€”将以 UTF-8 编码存储为三个字节“0xE2 0x82 0xAC”,但算作单个 Character.

要以 UTF-8 代码单位测量距离,请使用

let intIndex = str.utf8.distance(from: str.utf8.startIndex, to: range.lowerBound)

另请参阅Swift 博客中的Strings in Swift 2,了解有关字素簇和 Swift 字符串的不同视图的概述。

于 2018-03-14T06:52:36.303 回答