如何将带有特殊字符的字符串拆分为NSMutableArray

时间:2012-01-05 09:37:33

标签: objective-c ios nsstring special-characters unichar

我试图将带有丹麦字符的字符串分隔到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,我会得到一些非常危险的字符 - 出了什么问题?

/的Morten

4 个答案:

答案 0 :(得分:2)

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

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

  

将字符串视为一系列字符是很常见的,但是什么时候   使用NSString对象,或者通常使用Unicode字符串   在大多数情况下,最好处理子串而不是   个性人物。这个的原因是用户是什么   在许多情况下,作为文本中的字符可以被表示为   字符串中的多个字符。

你一定要阅读String Programming Guide

最后,为您准确的代码:

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的默认字符串化行为。如果要查看“普通字符”,可以逐个打印这些unicode字符:

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

答案 1 :(得分:0)

在您的示例中,ichar不是NSString的类型,而是unichar。如果您希望NSString尝试获取子字符串:

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

答案 2 :(得分:0)

您可以执行以下操作,对于丹麦语字符应该可以使用,但如果您已经分解了字符,则可以分解。我建议您阅读String Programming Guide以获取更多信息。

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

这会将字符串拆分为单个字符数组,假设所有代码点都是由字符组成的。

答案 3 :(得分:-1)

正在打印角色的unicode。无论如何,你可以在任何地方使用unicode(和\ u)。