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(" "))