【问题标题】:Strange String.unicodeScalars and CharacterSet behaviour奇怪的 String.unicodeScalars 和 CharacterSet 行为
【发布时间】:2017-07-04 07:08:37
【问题描述】:

我正在尝试使用 Swift 3 CharacterSet 过滤掉 String 中的字符,但我很早就被卡住了。 CharacterSet 有一个名为contains的方法

func contains(_ member: UnicodeScalar) -> Bool
测试 CharacterSet 中特定 UnicodeScalar 的成员资格。

但对此进行测试不会产生预期的行为。

let characterSet = CharacterSet.capitalizedLetters

let capitalAString = "A"

if let capitalA = capitalAString.unicodeScalars.first {
    print("Capital A is \(characterSet.contains(capitalA) ? "" : "not ")in the group of capital letters")
} else {
    print("Couldn't get the first element of capitalAString's unicode scalars")
}

我收到了Capital A is not in the group of capital letters,但我期望相反。

非常感谢。

【问题讨论】:

  • Martin 比我快,但该字符集不包含您要查找的大写字母 A:["Dž", "Lj", "Nj", "Dz", "ᾈ", "ᾉ", "ᾊ", "ᾋ", "ᾌ", "ᾍ", "ᾎ", "ᾏ", "ᾘ", "ᾙ", "ᾚ", "ᾛ", "ᾜ", "ᾝ", "ᾞ", "ᾟ", "ᾨ", "ᾩ", "ᾪ", "ᾫ", "ᾬ", "ᾭ", "ᾮ", "ᾯ", "ᾼ", "ῌ", "ῼ"]
  • 虽然 Martin 的回答是第一个并且是正确的,但我认为您已经发现了问题的根源——我什至不知道大写字母是什么!

标签: swift


【解决方案1】:

CharacterSet.capitalizedLetters 返回一个字符集,其中包含 Unicode General Category Lt aka "Letter, titlecase" 中的字符。那是 “包含大写后跟小写字母的连字(例如 Dž、Lj、Nj 和 Dz)”(比较 Wikipedia: Unicode character propertyUnicode® Standard Annex #44 – Table 12. General_Category Values)。

您可以在此处找到列表:Unicode Characters in the 'Letter, Titlecase' Category

您也可以使用以下代码 NSArray from NSCharacterset转储字符的内容 设置:

extension CharacterSet {
    func allCharacters() -> [Character] {
        var result: [Character] = []
        for plane: UInt8 in 0...16 where self.hasMember(inPlane: plane) {
            for unicode in UInt32(plane) << 16 ..< UInt32(plane + 1) << 16 {
                if let uniChar = UnicodeScalar(unicode), self.contains(uniChar) {
                    result.append(Character(uniChar))
                }
            }
        }
        return result
    }
}

let characterSet = CharacterSet.capitalizedLetters
print(characterSet.allCharacters())

// ["Dž", "Lj", "Nj", "Dz", "ᾈ", "ᾉ", "ᾊ", "ᾋ", "ᾌ", "ᾍ", "ᾎ", "ᾏ", "ᾘ", "ᾙ", "ᾚ", "ᾛ", "ᾜ", "ᾝ", "ᾞ", "ᾟ", "ᾨ", "ᾩ", "ᾪ", "ᾫ", "ᾬ", "ᾭ", "ᾮ", "ᾯ", "ᾼ", "ῌ", "ῼ"]

你可能想要的是CharacterSet.uppercaseLetters

返回一个字符集,其中包含 Unicode 通用类别 Lu 和 Lt 中的字符。

【讨论】:

  • 很好的答案,但是那个 fileformat.info URL 对我不起作用。
猜你喜欢
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2011-10-04
  • 2015-03-16
  • 2019-02-16
  • 2013-06-03
  • 2014-09-30
相关资源
最近更新 更多