Chcę wiedzieć, jak mogę sprawdzić, czy ciąg zawiera chiński w Swift?Jak mogę sprawdzić, czy ciąg zawiera chiński w Swift?
Na przykład, chcę, aby sprawdzić, czy jest chiński wewnątrz:
var myString = "Hi! 大家好!It's contains Chinese!"
Dzięki!
Chcę wiedzieć, jak mogę sprawdzić, czy ciąg zawiera chiński w Swift?Jak mogę sprawdzić, czy ciąg zawiera chiński w Swift?
Na przykład, chcę, aby sprawdzić, czy jest chiński wewnątrz:
var myString = "Hi! 大家好!It's contains Chinese!"
Dzięki!
This answer do How to determine if a character is a Chinese character można również łatwo być przetłumaczone z Ruby do Swift (obecnie aktualizowana Swift 3):
extension String {
var containsChineseCharacters: Bool {
return self.range(of: "\\p{Han}", options: .regularExpression) != nil
}
}
if myString.containsChineseCharacters {
print("Contains Chinese")
}
w wyrażeniu regularnym, „\ p {Han}” dopasowuje wszystkie znaki z „Han” własności Unicode , które - jak rozumiem - to znaki z języków CJK.
Patrząc na pytania, jak to zrobić w innych językach (np. this accepted answer dla Rubiego) wygląda na to, że powszechną techniką jest ustalenie, czy każdy znak w łańcuchu mieści się w zakresie CJK. Rubin odpowiedź mogła być dostosowana do Swift ciągów jako rozszerzenie z następującego kodu:
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
Zakresy mogą już istnieć w Fundacji gdzieś zamiast ręcznie je sztywno.
Powyższe jest dla Swift 2.0, na początku, trzeba będzie skorzystać z bezpłatnego contains
funkcję zamiast przedłużenia protokołu (dwukrotnie):
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) }
}
}
}
spróbować tego w 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)")
Utworzono rozszerzenie Swift 3 String do sprawdzenia, ile chińskich znaków zawiera ciąg. Podobny do kodu przez Airspeed Velocity, ale bardziej wszechstronny. Sprawdzanie różnych zakresów Unicode, aby sprawdzić, czy postać jest chińska. Zobacz chińskich zakresy znaków wymienionych w tabelach w sekcji 18.1 w Unicode standardowej specyfikacji: http://www.unicode.org/versions/Unicode9.0.0/ch18.pdf
Rozszerzenie String można znaleźć na GitHub: np https://github.com/niklasberglund/String-chinese.swift
Zastosowanie: tylko
let myString = "Hi! 大家好!It contains Chinese!"
let chinesePercentage = myString.chinesePercentage()
let chineseCharacterCount = myString.chineseCharactersCount()
print("String contains \(chinesePercentage) percent Chinese. That's \(chineseCharacterCount) characters.")
Zaakceptowanych odpowiedź znajdź, jeśli ciąg zawiera chiński znak, stworzyłem jeden kolor dla mojego własnego przypadku:
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")
}
tutaj: https://gist.github.com/williamhqs/6899691b5a26272550578601bee17f1a
i czy mogę uzyskać tylko chińskie słowa? Dzięki! – Arefly
@Arefly: Niestety, nie jestem ekspertem od języka chińskiego, mam "na ślepo" przetłumaczony kod Ruby :) Istnieją również właściwości "Katakana" i "Hiragana", ale nie wiem, czy są one jakieś posługiwać się. –
@Arefly: Aby uzyskać dokładniejszą kontrolę, odpowiedź Airspeed Velocity może być lepiej dopasowana, ponieważ możesz dopasować tabelę do zakresów kodu Unicode odpowiednio do swoich potrzeb, takich jak "tylko chińskie znaki". –