Guardando alle domande su come farlo in altre lingue (come ad esempio this accepted answer per Ruby) sembra che la tecnica comune sia determinare se ciascun carattere nella stringa rientra nell'intervallo CJK. La risposta rubino potrebbe essere adattato alle stringhe Swift come estensione con il seguente codice: possono essere già presenti
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
Gli intervalli in qualche Foundation anziché hardcoding manualmente.
Quanto sopra è per la Swift 2.0, per prima, si dovrà utilizzare la contains
funzione di libero piuttosto che l'estensione del protocollo (due volte):
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) }
}
}
}
fonte
2015-07-06 11:41:53
ed è comunque possibile ottenere solo le parole cinesi? Grazie! – Arefly
@Arefly: Sfortunatamente, non sono un esperto per la lingua cinese, ho "ciecamente" tradotto il codice Ruby :) Ci sono anche proprietà "Katakana" e "Hiragana", ma non so se sono di qualche uso. –
@Arefly: per un controllo più preciso, la risposta della velocità della velocità potrebbe essere più adatta in quanto è possibile regolare la tabella con gli intervalli Unicode in base alle proprie esigenze, ad esempio "solo caratteri cinesi". –