2015-07-06 4 views

Antwort

6

This answer zu How to determine if a character is a Chinese character kann auch leicht von Ruby Swift übersetzt werden (jetzt Swift aktualisiert 3):

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

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

In einem regulären Ausdruck, "\ p {} Han" paßt auf alle Zeichen mit der "Han" Unicode-Eigenschaft, die - wie ich es verstehe - sind die Zeichen aus den CJK Sprachen.

+0

und gibt es sowieso ich kann nur die chinesischen Wörter bekommen? Vielen Dank! – Arefly

+0

@Arefly: Leider bin ich kein Experte für die chinesische Sprache, ich habe "blind" den Ruby Code übersetzt :) Es gibt auch "Katakana" und "Hiragana" Eigenschaften, aber ich weiß nicht, ob sie von irgendwelchen sind benutzen. –

+0

@Arefly: Für eine detailliertere Steuerung ist die Antwort von Airspeed Velocity möglicherweise besser geeignet, da Sie die Tabelle mit den Unicode-Bereichen entsprechend Ihren Anforderungen anpassen können, z. B. "nur chinesische Zeichen". –

5

Wenn man sich fragt, wie man das in anderen Sprachen macht (wie this accepted answer für Ruby), sieht es aus, als ob die übliche Technik darin besteht, zu bestimmen, ob jedes Zeichen in der Zeichenfolge in den CJK-Bereich fällt. Der Rubin Antwort könnte mit dem folgenden Code zu Swift Strings als Erweiterung angepasst werden:

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 

Die Bereiche bereits in Foundation existieren können irgendwo, anstatt sie manuell zu.

Die oben ist für Swift 2.0, für früher, werden Sie die freie contains Funktion anstatt die Protokollerweiterung (zweimal) verwenden müssen:

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

Fehler: 'String.UnicodeScalarView hat kein Mitglied namens contains'? – Arefly

+0

ah Entschuldigung, das ist Swift 2.0, lassen Sie mich in eine Version für 1.2 setzen –

+0

ok, danke! :) – Arefly

2

Versuchen Sie dies in 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

Ich habe eine Swift 3 String-Erweiterung erstellt, um zu überprüfen, wie viele chinesische Zeichen eine Zeichenfolge enthält. Ähnlich wie der Code von Airspeed Velocity aber umfassender. Überprüfen verschiedener Unicode-Bereiche, um festzustellen, ob ein Zeichen chinesisch ist Siehe chinesische Zeichenbereiche aufgelistet in den Tabellen unter Abschnitt 18.1 in der Unicode-Standard-Spezifikation: http://www.unicode.org/versions/Unicode9.0.0/ch18.pdf

Die String-Erweiterung kann auf GitHub zu finden: https://github.com/niklasberglund/String-chinese.swift

Anwendungsbeispiel:

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

Die akzeptierte Antwort nur finden, wenn Zeichenfolge chinesische Zeichen enthält, habe ich einen Anzug für meinen eigenen Fall:

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

gibts hier: https://gist.github.com/williamhqs/6899691b5a26272550578601bee17f1a

Verwandte Themen