2015-07-06 21 views

Odpowiedz

6

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.

+0

i czy mogę uzyskać tylko chińskie słowa? Dzięki! – Arefly

+0

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

+0

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

5

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

Błąd: 'String.UnicodeScalarView nie ma członka o nazwie zawiera'? – Arefly

+0

ah przepraszam, to jest Swift 2.0, pozwól mi wstawić wersję dla 1.2 –

+0

ok, dziękuję! :) – Arefly

2

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

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.") 
1

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

Powiązane problemy