奇怪的 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 行为的主要内容,如果未能解决你的问题,请参考以下文章