3 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個贊
以下代碼創(chuàng)建一個包含給定字符集的所有字符的數(shù)組。它也適用于“基本多語言平面”之外的字符(字符> U + FFFF,例如U + 10400 DESERET CAPITAL LETTER LONG I)。
NSCharacterSet *charset = [NSCharacterSet uppercaseLetterCharacterSet];
NSMutableArray *array = [NSMutableArray array];
for (int plane = 0; plane <= 16; plane++) {
if ([charset hasMemberInPlane:plane]) {
UTF32Char c;
for (c = plane << 16; c < (plane+1) << 16; c++) {
if ([charset longCharacterIsMember:c]) {
UTF32Char c1 = OSSwapHostToLittleInt32(c); // To make it byte-order safe
NSString *s = [[NSString alloc] initWithBytes:&c1 length:4 encoding:NSUTF32LittleEndianStringEncoding];
[array addObject:s];
}
}
}
}
為此,uppercaseLetterCharacterSet給出了1467個元素的數(shù)組。但請注意,字符> U + FFFF作為UTF-16代理對存儲在中NSString,因此例如U + 10400實(shí)際上存儲NSString為2個字符“ \ uD801 \ uDC00”。
Swift 2代碼可以在此問題的其他答案中找到。這是一個Swift 3版本,作為擴(kuò)展方法編寫的:
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 charset = CharacterSet.uppercaseLetters
let chars = charset.allCharacters()
print(chars.count) // 1521
print(chars) // ["A", "B", "C", ... "]
(請注意,某些字符可能不會顯示在用于顯示結(jié)果的字體中。)
添加回答
舉報(bào)