2015-07-06 28 views

Trả lời

6

This answer đến How to determine if a character is a Chinese character cũng có thể dễ dàng được dịch từ Ruby to Swift (hiện được cập nhật cho Swift 3):

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

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

Trong một biểu thức chính quy, "\ p {Han}" phù hợp với tất cả các nhân vật với "Han" tài sản Unicode, mà - như tôi hiểu nó - là những nhân vật từ các ngôn ngữ CJK.

+0

và có anyway tôi có thể nhận được chỉ là những từ Trung Quốc? Cảm ơn! – Arefly

+0

@Arefly: Thật không may, tôi không phải là chuyên gia về ngôn ngữ Trung Quốc, tôi đã "mù quáng" dịch mã Ruby :) Ngoài ra còn có các thuộc tính "Katakana" và "Hiragana", nhưng tôi không biết chúng có thuộc loại nào không sử dụng. –

+0

@Arefly: Để kiểm soát chi tiết hơn, câu trả lời của Airspeed Velocity có thể phù hợp hơn vì bạn có thể điều chỉnh bảng với phạm vi Unicode theo nhu cầu của bạn, chẳng hạn như "chỉ các ký tự tiếng Trung". –

5

Nhìn vào các câu hỏi về cách thực hiện điều này bằng các ngôn ngữ khác (chẳng hạn như this accepted answer đối với Ruby) có vẻ như kỹ thuật chung là xác định xem mỗi ký tự trong chuỗi có nằm trong dải CJK hay không. Câu trả lời ruby ​​có thể được điều chỉnh theo các chuỗi Swift dưới dạng mở rộng với mã sau:

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 

Phạm vi có thể tồn tại ở một nơi nào đó thay vì mã hóa chúng theo cách thủ công.

Trên đây là dành cho Swift 2.0, cho trước đó, bạn sẽ phải sử dụng miễn phí contains chức năng chứ không phải là mở rộng giao thức (hai lần):

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

Lỗi: 'String.UnicodeScalarView không có thành viên có tên contains'? – Arefly

+0

ah xin lỗi, đây là Swift 2.0, hãy để tôi đặt một phiên bản cho 1,2 –

+0

ok, cảm ơn bạn! :) – Arefly

2

Hãy thử điều này trong 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

Tôi đã tạo tiện ích mở rộng Chuỗi Swift 3 để kiểm tra xem có bao nhiêu ký tự Trung Quốc mà Chuỗi chứa. Tương tự như mã của Airspeed Velocity nhưng toàn diện hơn. Kiểm tra các phạm vi Unicode khác nhau để xem liệu một nhân vật có phải là tiếng Trung hay không. Xem các dãy ký tự Trung Quốc liệt kê trong bảng dưới phần 18,1 trong tiêu chuẩn Unicode đặc điểm kỹ thuật: http://www.unicode.org/versions/Unicode9.0.0/ch18.pdf

Các chuỗi mở rộng có thể được tìm thấy trên GitHub: ví dụ https://github.com/niklasberglund/String-chinese.swift

Cách sử dụng:

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

Câu trả lời chỉ được chấp nhận tìm xem chuỗi có chứa ký tự tiếng Trung hay không, tôi đã tạo một bộ trang phục cho trường hợp của riêng mình:

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 đây: https://gist.github.com/williamhqs/6899691b5a26272550578601bee17f1a

Các vấn đề liên quan