gpt4 book ai didi

swift - NSString.rangeOfString 返回带有非拉丁字符的异常结果

转载 作者:搜寻专家 更新时间:2023-11-01 06:18:20 25 4
gpt4 key购买 nike

我需要获取字符串中两个单词的范围,例如:

ยัฟิแก ไฟหก

(这实际上是我在输入 PYABCD WASD)- 这是一个毫无意义的测试,因为我不会说泰语。

//Find all the ranges of each word
var words: [String] = []
var ranges: [NSRange] = []

//Convert to nsstring first because otherwise you get stuck with Ranges and Strings.
let nstext = backgroundTextField.stringValue as NSString //contains "ยัฟิแก ไฟหก"
words = nstext.componentsSeparatedByString(" ")
var nstextLessWordsWeHaveRangesFor = nstext //if you have two identical words this prevents just getting the first word's range

for word in words
{

let range:NSRange = nstextLessWordsWeHaveRangesFor.rangeOfString(word)
Swift.print(range)
ranges.append(range)

//create a string the same length as word
var fillerString:String = ""

for i in 0..<word.characters.count{
//for var i=0;i<word.characters.count;i += 1{
Swift.print("i: \(i)")
fillerString = fillerString.stringByAppendingString(" ")
}

//remove duplicate words / letters so that we get correct range each time.
if range.length <= nstextLessWordsWeHaveRangesFor.length
{
nstextLessWordsWeHaveRangesFor = nstextLessWordsWeHaveRangesFor.stringByReplacingCharactersInRange(range, withString: fillerString)
}
}

输出:

(0,6)
(5,4)

这些范围是重叠的。

这会导致我在尝试使用 NSLayoutManager.enumerateEnclosingRectsForGlyphRange 时出现问题,因为范围不一致。

如何获得正确的范围(或者在这种特定情况下,不重叠的范围)?

最佳答案

Swift String 字符描述“扩展字素簇”,而 NSString使用 UTF-16 代码点,因此字符串的长度不同取决于您使用的表示方式。

比如第一个字符"ยั"其实就是组合"ย" (U+0E22) 的变音标记 "ั" (U+0E31)。这算作一个 String 字符,但算作两个 NSString 字符。因此,当您将单词替换为空格。

最简单的解决方案是坚持使用一个,StringNSString(如果可能的话)。由于您正在使用 NSString,因此更改

 for i in 0..<word.characters.count {

for i in 0..<range.length {

应该可以解决问题。填充字符串的创建可以简化为

//create a string the same length as word
let fillerString = String(count: range.length, repeatedValue: Character(" "))

关于swift - NSString.rangeOfString 返回带有非拉丁字符的异常结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39355552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com