如何检查Swift中的字符串是否包含中文?
How can I check if a string contains Chinese in Swift?
我想知道如何在Swift中检查字符串是否包含中文?
比如我想查看里面有没有中文:
var myString = "Hi! 大家好!It's contains Chinese!"
谢谢!
查看有关如何用其他语言执行此操作的问题(例如 this accepted answer for 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 { [=10=].contains(scalar.value) }
}
}
}
// true:
"Hi! 大家好!It's contains Chinese!".containsChineseCharacters
// false:
"Hello, world!".containsChineseCharacters
这些范围可能已经存在于 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) { [=11=].contains(scalar.value) }
}
}
}
在 Swift 2 试试这个:
var myString = "Hi! 大家好!It's contains Chinese!"
var a = false
for c in myString.characters {
let cs = String(c)
a = a || (cs != cs.stringByApplyingTransform(NSStringTransformMandarinToLatin, reverse: false))
}
print("\(myString) contains Chinese characters = \(a)")
This answer
到 How to determine if a character is a Chinese character 也可以很容易地从
Ruby 到 Swift(现在更新为 Swift 3):
extension String {
var containsChineseCharacters: Bool {
return self.range(of: "\p{Han}", options: .regularExpression) != nil
}
}
if myString.containsChineseCharacters {
print("Contains Chinese")
}
在正则表达式中,“\p{Han}”匹配所有带有
"Han" Unicode 属性,据我了解,这是字符
来自 CJK 语言。
我创建了一个 Swift 3 字符串扩展,用于检查一个字符串包含多少汉字。类似于 Airspeed Velocity 的代码,但更全面。检查各种 Unicode 范围以查看字符是否为中文。参见Unicode标准规范18.1节表格中所列汉字范围:http://www.unicode.org/versions/Unicode9.0.0/ch18.pdf
可以在 GitHub 上找到字符串扩展:https://github.com/niklasberglund/String-chinese.swift
用法示例:
let myString = "Hi! 大家好!It contains Chinese!"
let chinesePercentage = myString.chinesePercentage()
let chineseCharacterCount = myString.chineseCharactersCount()
print("String contains \(chinesePercentage) percent Chinese. That's \(chineseCharacterCount) characters.")
接受的答案只查找字符串是否包含汉字,我为自己的情况创建了一套:
enum ChineseRange {
case notFound, contain, all
}
extension String {
var findChineseCharacters: ChineseRange {
guard let a = self.range(of: "\p{Han}*\p{Han}", options: .regularExpression) else {
return .notFound
}
var result: ChineseRange
switch a {
case nil:
result = .notFound
case self.startIndex..<self.endIndex:
result = .all
default:
result = .contain
}
return result
}
}
if "你好".findChineseCharacters == .all {
print("All Chinese")
}
if "Chinese".findChineseCharacters == .notFound {
print("Not found Chinese")
}
if "Chinese你好".findChineseCharacters == .contain {
print("Contains Chinese")
}
要点在这里:https://gist.github.com/williamhqs/6899691b5a26272550578601bee17f1a
我想知道如何在Swift中检查字符串是否包含中文?
比如我想查看里面有没有中文:
var myString = "Hi! 大家好!It's contains Chinese!"
谢谢!
查看有关如何用其他语言执行此操作的问题(例如 this accepted answer for 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 { [=10=].contains(scalar.value) }
}
}
}
// true:
"Hi! 大家好!It's contains Chinese!".containsChineseCharacters
// false:
"Hello, world!".containsChineseCharacters
这些范围可能已经存在于 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) { [=11=].contains(scalar.value) }
}
}
}
在 Swift 2 试试这个:
var myString = "Hi! 大家好!It's contains Chinese!"
var a = false
for c in myString.characters {
let cs = String(c)
a = a || (cs != cs.stringByApplyingTransform(NSStringTransformMandarinToLatin, reverse: false))
}
print("\(myString) contains Chinese characters = \(a)")
This answer 到 How to determine if a character is a Chinese character 也可以很容易地从 Ruby 到 Swift(现在更新为 Swift 3):
extension String {
var containsChineseCharacters: Bool {
return self.range(of: "\p{Han}", options: .regularExpression) != nil
}
}
if myString.containsChineseCharacters {
print("Contains Chinese")
}
在正则表达式中,“\p{Han}”匹配所有带有 "Han" Unicode 属性,据我了解,这是字符 来自 CJK 语言。
我创建了一个 Swift 3 字符串扩展,用于检查一个字符串包含多少汉字。类似于 Airspeed Velocity 的代码,但更全面。检查各种 Unicode 范围以查看字符是否为中文。参见Unicode标准规范18.1节表格中所列汉字范围:http://www.unicode.org/versions/Unicode9.0.0/ch18.pdf
可以在 GitHub 上找到字符串扩展:https://github.com/niklasberglund/String-chinese.swift
用法示例:
let myString = "Hi! 大家好!It contains Chinese!"
let chinesePercentage = myString.chinesePercentage()
let chineseCharacterCount = myString.chineseCharactersCount()
print("String contains \(chinesePercentage) percent Chinese. That's \(chineseCharacterCount) characters.")
接受的答案只查找字符串是否包含汉字,我为自己的情况创建了一套:
enum ChineseRange {
case notFound, contain, all
}
extension String {
var findChineseCharacters: ChineseRange {
guard let a = self.range(of: "\p{Han}*\p{Han}", options: .regularExpression) else {
return .notFound
}
var result: ChineseRange
switch a {
case nil:
result = .notFound
case self.startIndex..<self.endIndex:
result = .all
default:
result = .contain
}
return result
}
}
if "你好".findChineseCharacters == .all {
print("All Chinese")
}
if "Chinese".findChineseCharacters == .notFound {
print("Not found Chinese")
}
if "Chinese你好".findChineseCharacters == .contain {
print("Contains Chinese")
}
要点在这里:https://gist.github.com/williamhqs/6899691b5a26272550578601bee17f1a