2016-08-02 122 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 
    }  

} 
相关问题