Как разделить строку со специальными символами в NSMutableArray - PullRequest
4 голосов
/ 05 января 2012

Я пытаюсь отделить строку с датскими символами в NSMutableArray.Но что-то не работает.: (

Мой код:

NSString *danishString = @"æøå";

NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[danishString length]]; 

for (int i=0; i < [danishString length]; i++) 
{ 
     NSString *ichar = [NSString stringWithFormat:@"%c", [danishString characterAtIndex:i ]]; 
     [characters addObject:ichar]; 
} 

Если я делаю в NSLog на danishString, он работает (возвращает);

Но если я делаю NSLog для символов(массив) Я получаю несколько очень странных символов - Что не так?

/ Мортен

Ответы [ 4 ]

2 голосов
/ 05 января 2012

Прежде всего, ваш код неверен.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);
}
0 голосов
/ 05 января 2012

В вашем примере ichar - это не тип NSString, а unichar.Если вы хотите NSString s, попробуйте вместо этого получить подстроку:

NSString *danishString = @"æøå";
NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[danishString length]]; 

for (int i=0; i < [danishString length]; i++) 
{ 
    NSRange r = NSMakeRange(i, 1);
    NSString *ichar = [danishString substringWithRange:r]; 
    [characters addObject:ichar]; 
}
0 голосов
/ 05 января 2012

Вы могли бы сделать что-то вроде следующего, что должно быть хорошо с датскими символами, но сломалось бы, если у вас есть разложенные символы.Я предлагаю прочитать Руководство по программированию строки для получения дополнительной информации.

NSString *danishString = @"æøå";
NSMutableArray* characters = [NSMutableArray array];
for( int i = 0; i < [danishString length]; i++ ) {
  NSString* subchar = [danishString substringWithRange:NSMakeRange(i, 1)];
  if( subchar ) [characters addObject:subchar];
}

Это разделит строку на массив отдельных символов, при условии, что все кодовые точки состоят из символов.

0 голосов
/ 05 января 2012

Это печать Unicode символов. В любом случае вы можете использовать юникод (с \ u) где угодно.

...