带有方言的字符串中的NSRange

时间:2014-10-09 14:50:23

标签: ios objective-c xcode unicode swift

我正在开发一个应用程序,它使用一种名为“Tamil”的语言输入。因此,为了找到字符串中任何特定字符的范围,我使用了以下代码。

var range = originalWord.rangeOfString("\(character)")
println("\(range.location)")

所以除了某些情况外,这种方法很好。

有一些像这样的字符 - > í,ó。 //我只是说一个例子。

所以喜欢这种组合,在其他语言中有几个元音变音符号。

如果我有这个词“alv`in”

//这是alvin,但我用方言“v”。  如果我在xcode中打印这些字符的unicde值,我将得到每个unicode。但对于“v`”,将有两个unicode值,但它被视为单个字符。

所以如果我在上面提到的代码中检查这个字符。我得到了以下结果。这会给我的程序带来错误。

range.location // 2147483647,它不是一个数字。?为什么?

但是对于其他角色,它只会打印正确的Int值。 //单个数字,如“3”

任何人都知道如何完成这项工作。如果我使用带有角色的字符

,我该如何实现这一点

下面给出的代码

// userInput = "இல்லம்"

var originalWord : NSString = ("இல்லம்")

   var originalArray = Array("இல்லம்")

        var userInputWord = Array(String(userInput))



       // -------------------------------------------

        for character in String(userInput)
        {
            switch character
            {

            case originalArray[0] :

                // here matches first character of the userinput to the original word first character

                // the character exists at the 0th index


                var range = originalWord.rangeOfString("\(character)")


                if range.location == 0
                {
                     // same character in the same index
                    // correctValue increase by one (cow Value)

                    cowValue += 1

                }
                else
                {
                    // same character but in the different index 
                    // Wrong value increase by one (bull Value)

                    bullValue += 1
                }


            case originalArray[1] :

                // here matches first character of the userinput to the original word first character

                // the character exists at the 1th index


                var range = originalWord.rangeOfString("\(character)")

                println("\(range.location)") // here i get he long Int Value instead of single digit


                if range.location == 1
                {
                    // same character in the same index
                    // correctValue increase by one (cow Value)

                    cowValue += 1

                }
                else
                {
                    // same character but in the different index
                    // Wrong value increase by one (bull Value)

                    bullValue += 1
                }

2 个答案:

答案 0 :(得分:2)

你应该使用Swift字符串而不是NSString,因为Swift字符串有 完整的Unicode支持,包括组合字符序列,(扩展)字形集群等。

对于Swift字符串,rangeOfString()返回一个可选的Range<String.Index> 处理起来有点复杂。您也可以使用find()代替 找到一个角色的位置。这可能有助于作为一个起点:

var cowValue = 0
var bullValue = 0

let userInput = "இல்லம்"
let originalWord = "இல்லம்"
let originalArray = Array("இல்லம்")

for character in userInput {
    switch character {
    case originalArray[0] :
        if let pos = find(originalWord, character) {
            // Character found in string
            println(pos)
            if pos == originalWord.startIndex {
                // At position 0
                cowValue += 1
            } else {
                // At a different position
                bullValue += 1
            }
        } else {
            // Character not found in string
        }

    case originalArray[1] :
        if let pos = find(originalWord, character) {
            // Character found in string
            println(pos)
            if pos == advance(originalWord.startIndex, 1) {
                // At position 1
                cowValue += 1
            } else {
                // At a different position
                bullValue += 1
            }
        } else {
            // Character not found in string
        }
    default:
        println("What ?")
    }
}

答案 1 :(得分:0)

查看NSString的rangeOfComposedCharacterSequenceAtIndex:和rangeOfComposedCharacterSequencesForRange的文档:

您想要查找“组合字符序列”,而不是单个字符。