我如何分割一个string到特殊字符到一个NSMutableArray

我试图把一个带有丹麦字符的string分隔成一个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,我会得到一些非常类似的字符 – 什么是错的?

/莫滕

首先,你的代码是不正确的。 characterAtIndex返回unichar ,所以你应该使用@"%C" (大写)作为格式说明符。

即使使用正确的格式说明符,您的代码也是不安全的,严格来说,仍然是不正确的,因为不是所有的unicode字符都可以由一个unichar表示。 你应该总是处理每个子string的Unicodestring:

通常将string视为一系列字符,但在使用NSString对象或一般使用Unicodestring时,在大多数情况下,最好处理子string而不是单个字符。 这样做的原因是,用户在文本中认为是字符的情况在很多情况下可能由string中的多个字符表示。

你一定要阅读string编程指南 。

最后,给你正确的代码:

 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); 你看到forms为“\ Uxxxx”的“奇怪的字符”,这是正确的。 这是通过description方法的NSArray默认的string化行为。 如果要查看“正常字符”,则可以逐个打印这些unicode字符:

 for (NSString *c in characters) { NSLog(@"%@", c); } 

在你的例子中, ichar不是NSStringtypes,而是unichar 。 如果你想NSString s试着得到一个子string:

 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]; } 

你可以做下面这样的事情,对于丹麦人来说应该没问题,但是如果你已经分解了字符,就会崩溃。 我build议阅读string编程指南了解更多信息。

 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]; } 

这将把string拆分成一个单独的字符数组,假设所有的代码点都是组成字符。

这是打印字符的Unicode。 无论如何,你可以在任何地方使用unicode(使用\ u)。