2015-07-06 11 views

risposta

6

This answer a How to determine if a character is a Chinese character può facilmente essere tradotto da rubino a Swift (ora aggiornato per Swift 3):

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

if myString.containsChineseCharacters { 
    print("Contains Chinese") 
} 

In un'espressione regolare, "\ p {} Han" corrisponde a tutti i caratteri con la proprietà Unicode "Han", che - a quanto ho capito - sono i personaggi dalle lingue CJK.

+0

ed è comunque possibile ottenere solo le parole cinesi? Grazie! – Arefly

+0

@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. –

+0

@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". –

5

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) } 
     } 
    } 
} 
+0

Errore: 'String.UnicodeScalarView non ha un membro denominato contiene'? – Arefly

+0

ah scusate, questo è Swift 2.0, lasciatemi inserire una versione per 1.2 –

+0

ok, grazie! :) – Arefly

2

Prova questa a 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)") 
0

Ho creato un'estensione di stringa Swift 3 per verificare quanti caratteri cinesi contiene una stringa. Simile al codice di Airspeed Velocity ma più completo. Controllo di vari intervalli Unicode per vedere se un personaggio è cinese. Vedere intervalli di caratteri cinesi elencati nelle tabelle di cui al punto 18.1 nella specifica standard Unicode: http://www.unicode.org/versions/Unicode9.0.0/ch18.pdf

L'estensione String può essere trovato su GitHub: esempio https://github.com/niklasberglund/String-chinese.swift

Uso: solo

let myString = "Hi! 大家好!It contains Chinese!" 
let chinesePercentage = myString.chinesePercentage() 
let chineseCharacterCount = myString.chineseCharactersCount() 
print("String contains \(chinesePercentage) percent Chinese. That's \(chineseCharacterCount) characters.") 
1

La risposta accettata trova se la stringa contiene il carattere cinese, ho creato un seme per il mio caso:

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") 
} 

gist here: https://gist.github.com/williamhqs/6899691b5a26272550578601bee17f1a

Problemi correlati