Swift NSString.rangeOfString返回非拉丁字符的异常结果

Swift NSString.rangeOfString返回非拉丁字符的异常结果,swift,cocoa,nsstring,nsrange,Swift,Cocoa,Nsstring,Nsrange,我需要获取字符串中两个单词的范围,例如: ยัฟิแก ไฟหก 这简直是我在输入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 String

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

ยัฟิแก ไฟหก
这简直是我在输入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)
            }             
        }
这些范围是重叠的

这会在我尝试使用NSLayoutManager.EnumeratingEnclosuringRectionsForglyPhrange的过程中产生问题,因为范围不一致

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

删除NSTextleSharveRange以解决底部从range.length开始的问题删除NSTextleSharveRange以解决底部从range.length开始的问题Swift字符串描述扩展的字形集群,以及NSString 使用UTF-16代码点,因此字符串的长度不同 取决于您使用的表示形式

例如,第一个字符ยั 实际上是组合 属于ย 带变音符号的U+0E22ั U+0E31。 它计为一个字符串,但计为两个字符串。 因此,当您将单词替换为时,索引会发生变化 空间

最简单的解决方案是坚持使用一个字符串或NSString 如果可能的话。由于您正在使用NSString,因此

 for i in 0..<word.characters.count {
Swift字符串描述扩展的grapheme集群,NSString 使用UTF-16代码点,因此字符串的长度不同 取决于您使用的表示形式

例如,第一个字符ยั 实际上是组合 属于ย 带变音符号的U+0E22ั U+0E31。 它计为一个字符串,但计为两个字符串。 因此,当您将单词替换为时,索引会发生变化 空间

最简单的解决方案是坚持使用一个字符串或NSString 如果可能的话。由于您正在使用NSString,因此

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

您的代码中只有一个print语句,如何获得两行输出?它实际上是伪代码—试图隔离问题。在应用程序中,它循环使用字符串中的单词。一个可复制的、自包含的示例演示该问题会很有帮助。在它上-给我一个mo。@MartinR我需要知道你的午休时间安排,这样我就有机会抓住一些因果关系。你的代码中只有一条打印语句,如何获得两条输出行?这实际上是伪代码—试图隔离问题。在应用程序中,它循环使用字符串中的单词。一个可复制的、自包含的示例演示这个问题会很有帮助。在它上-给我一个mo。@MartinR我需要知道你的午休时间安排,这样我就有可能有一个滚雪球的机会抓住一些因果关系。
 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(" "))