奇怪的 String.unicodeScalars 和 CharacterSet 行为

Posted

技术标签:

【中文标题】奇怪的 String.unicodeScalars 和 CharacterSet 行为【英文标题】:Strange String.unicodeScalars and CharacterSet behaviour 【发布时间】: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 的回答是第一个并且是正确的,但我认为您已经发现了问题的根源——我什至不知道大写字母是什么! 【参考方案1】:

CharacterSet.capitalizedLetters 返回一个字符集,其中包含 Unicode General Category Lt aka "Letter, titlecase" 中的字符。那是 “包含大写后跟小写字母的连字(例如 Dž、Lj、Nj 和 Dz)”(比较 Wikipedia: Unicode character property 或 Unicode® 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 对我不起作用。

以上是关于奇怪的 String.unicodeScalars 和 CharacterSet 行为的主要内容,如果未能解决你的问题,请参考以下文章

有一个很奇怪的数学问题

Linux升级openssl时遇到的奇怪错误

很奇怪,谁知道这是啥编码???

奇怪的443端口?请专家释疑……

比较奇怪的数学问题 (很好理解)

在spark中遇到了奇怪的错误,找到了奇怪的解决方法