2016-08-02 120 views
3

是否有某種方法可以檢查字符串是拉丁字母還是西裏爾字母?我試過localizedCompare字符串方法,但它沒有給我需要的結果。檢查字符串是拉丁字母還是西里爾文

+0

你的意思是,如果一個字符串包含*僅拉丁語*或*僅西里爾·人物?因爲一個字符串可以包含兩個字符(加上一些其他字符,如希臘語,中文,阿拉伯語,希伯來語...) –

+0

所有字符串或至少是字符。 – Ookey

+0

如果兩者都不存在或兩者兼而有之? – Alexander

回答

0

這樣的事情呢?

extension String { 
    var isLatin: Bool { 
     let upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
     let lower = "abcdefghijklmnopqrstuvwxyz" 

     for c in self.characters.map({ String($0) }) { 
      if !upper.containsString(c) && !lower.containsString(c) { 
       return false 
      } 
     } 

     return true 
    } 

    var isCyrillic: Bool { 
     let upper = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЮЯ" 
     let lower = "абвгдежзийклмнопрстуфхцчшщьюя" 

     for c in self.characters.map({ String($0) }) { 
      if !upper.containsString(c) && !lower.containsString(c) { 
       return false 
      } 
     } 

     return true 
    } 

    var isBothLatinAndCyrillic: Bool { 
     return self.isLatin && self.isCyrillic 
    } 
} 

使用

let s = "Hello" 
if s.isLatin && !s.isBothLatinAndCyrillic { 
    // String is latin 
} else if s.isCyrillic && !s.isBothLatinAndCyrillic { 
    // String is cyrillic 
} else if s.isBothLatinAndCyrillic { 
    // String can be either latin or cyrillic 
} else { 
    // String is not latin nor cyrillic 
} 

Considere存在這樣的情況給定的字符串可能是兩個,例如字符串:

let s = "A" 

既可以是拉丁或西里爾。所以這就是爲什麼有「是兩個」的功能。

而且它也可以是沒有人:

let s = "*" 
+0

這不是一個好的解決方案。至少對於IOS 11.請檢查https:// stackoverflow。com/questions/47890747/how-to-detect-text-string-language-in-ios/47890753#47890753 –

+0

iOS 11在2016年不存在:) –

+0

是的。我爲任何尋找類似解決方案的人添加了這一點。 –

2

你應該得到所有Unicode字符,並檢測是否包含基於Unicode值斯拉夫字符或拉丁字符。此代碼不完整,您可以完成它。

let a : String = "ӿ" //unicode value = 04FF 
let scalars = a.unicodeScalars 

//get unicode value of first char: 
let unicodeValue = scalars[scalars.startIndex].value //print 1279, correspondant to 04FF. 

在這裏檢查所有的unicode值(以十六進制)。 http://jrgraphix.net/r/Unicode/0400-04FF

根據這個網站,西里爾值從0400 - > 04FF(1024 - > 1279)

這是西里爾檢查代碼:

var isCyrillic = true 
for (index, unicode) in scalars.enumerate() { 
    if (unicode.value < 1024 || unicode.value > 1279) { 
     print("not a cyrillic text") 
     print(unicode.value) 
     isCyrillic = false 
     break 
    } 
} 
1

出人意料的是,有沒有簡單的答案對你的問題。拉丁字母不僅包含A - Z,還有法語的重音字符和德語的古體形式等。我不知道西裏爾字母,所以我會放棄它。最重要的是,你必須處理:標點符號(.,?"()等)和白色空間,表情符號,箭頭,丁字褲...這是語言中立。取決於您的要求,複雜性可能會很快升級。

您接受的答案不足以說明:,因爲它不涉及空格。

訪問網站like this one以瞭解哪些範圍包含哪些語言的字符並使用下面的代碼進行播放。這不是一個完整的答案,但意思是讓你開始:

let neutralRanges = [0x20...0x40] 
let latinRanges = [0x41...0x5A, 0x61...0x7A, 0xC0...0xFF, 0x100...0x17F] 
let cyrillicRanges = [0x400...0x4FF, 0x500...0x52F] 

func scalar(scalar: UnicodeScalar, isInRanges ranges: [Range<Int>]) -> Bool { 
    for r in ranges { 
     if r ~= Int(scalar.value) { 
      return true 
     } 
    } 

    return false 
} 

let str = "Hello world" 
var isLatin = true 
var isCyrillic = true 

for s in "Hello world".unicodeScalars { 
    if scalar(s, isInRanges: neutralRanges) { 
     continue 
    } 
    else if !scalar(s, isInRanges: latinRanges) { 
     isLatin = false 
    } 
    else if !scalar(s, isInRanges: cyrillicRanges) { 
     isCyrillic = false 
    } 
} 

print(isLatin) 
print(isCyrillic) 
0

斯威夫特3: 對於波斯語和阿拉伯語

extension String { 

    var isFarsi: Bool { 

     //Remove extra spaces from the first and last word 
     let value = self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) 

     if value == "" { 
      return false 
     } 

     let farsiLetters = "آ ا ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ی ن و ه" 
     let arabicLetters = " ء ا أ إ ء ؤ ئـ ئ آ اً ة ا ب ت ث ج ‌ ح خ د ذ ر ز س ‌ ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي" 
     for c in value.characters.map({ String($0) }) { 
      if !farsiLetters.contains(c) && !arabicLetters.contains(c) { 
       return false 
      } 
     } 

     return true 
    }  

} 
相關問題