如何在Swift中检查字符串是否包含中文?

He *_*何一非 5 chinese-locale swift

我想知道如何在Swift中检查字符串是否包含中文?

例如,我想检查里面是否有中文:

var myString = "Hi! ????It's contains Chinese!"

谢谢!

Mar*_*n R 9

这个答案如何确定一个字符是一个中国字也可以很容易地从红宝石被翻译成斯威夫特(现在更新的斯威夫特3):

extension String {
    var containsChineseCharacters: Bool {
        return self.range(of: "\\p{Han}", options: .regularExpression) != nil
    }
}

if myString.containsChineseCharacters {
    print("Contains Chinese")
}
Run Code Online (Sandbox Code Playgroud)

在正则表达式中,"\ p {Han}"匹配具有"Han"Unicode属性的所有字符,根据我的理解,它是CJK语言中的字符.


Air*_*ity 5

看看如何在其他语言中执行此操作的问题(例如Ruby的这个接受的答案),看起来常见的技术是确定字符串中的每个字符是否都在CJK范围内.ruby的答案可以通过以下代码适应Swift字符串作为扩展名:

extension String {
    var containsChineseCharacters: Bool {
        return self.unicodeScalars.contains { scalar in
            let cjkRanges: [ClosedInterval<UInt32>] = [
                0x4E00...0x9FFF,   // main block
                0x3400...0x4DBF,   // extended block A
                0x20000...0x2A6DF, // extended block B
                0x2A700...0x2B73F, // extended block C
            ]
            return cjkRanges.contains { $0.contains(scalar.value) }
        }
    }
}

// true:
"Hi! ????It's contains Chinese!".containsChineseCharacters
// false:
"Hello, world!".containsChineseCharacters
Run Code Online (Sandbox Code Playgroud)

这些范围可能已经存在于Foundation的某个地方,而不是手动硬编码.

以上是针对Swift 2.0的,对于之前的版本,您将不得不使用自由contains函数而不是协议扩展(两次):

extension String {
    var containsChineseCharacters: Bool {
        return contains(self.unicodeScalars) {
          // older version of compiler seems to need extra help with type inference 
          (scalar: UnicodeScalar)->Bool in
            let cjkRanges: [ClosedInterval<UInt32>] = [
                0x4E00...0x9FFF,   // main block
                0x3400...0x4DBF,   // extended block A
                0x20000...0x2A6DF, // extended block B
                0x2A700...0x2B73F, // extended block C
            ]
            return contains(cjkRanges) { $0.contains(scalar.value) }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)