Прежде всего, ваш код неверен.characterAtIndex
возвращает unichar
, поэтому вы должны использовать @"%C"
(верхний регистр) в качестве спецификатора формата.
Даже при правильном указателе формата ваш код небезопасен и, строго говоря, по-прежнему неверен, поскольку невсе символы Юникода могут быть представлены одним unichar
.Вы должны всегда обрабатывать строки Unicode для каждой подстроки:
Обычно считается, что строка представляет собой последовательность символов, но при работе с объектами NSString или со строками Unicode в целом, в большинстве случаев этолучше иметь дело с подстроками, а не с отдельными символами.Причина этого заключается в том, что то, что пользователь воспринимает как символ в тексте, во многих случаях может быть представлено несколькими символами в строке.
Вам определенно следует прочитать Руководство по программированию строки .
Наконец, правильный для вас код:
NSString *danishString = @"æøå";
NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[danishString length]];
[danishString enumerateSubstringsInRange:NSMakeRange(0, danishString.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
[characters addObject:substring];
}];
Если с NSLog(@"%@", characters);
вы видите «странный символ» формы «\ Uxxxx», это правильно.Это строковое поведение по умолчанию NSArray
методом description
.Вы можете распечатать эти символы Юникода один за другим, если хотите видеть «нормальные символы»:
for (NSString *c in characters) {
NSLog(@"%@", c);
}