4

我正在尝试将带有丹麦字符的字符串分隔成 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]; 
} 

如果我在 danishString 上的 NSLog 上做,它可以工作(返回æøå);

但是,如果我对字符(数组)执行 NSLog,我会得到一些非常奇怪的字符 - 有什么问题?

/莫腾

4

4 回答 4

2

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

即使使用正确的格式说明符,您的代码也是不安全的,严格来说,仍然不正确,因为并非所有 unicode 字符都可以由单个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这是bydescription方法的默认字符串化行为。如果您想查看“普通字符”,可以一一打印这些 un​​icode 字符:

for (NSString *c in characters) {
    NSLog(@"%@", c);
}
于 2012-01-05T12:02:00.700 回答
0

您可以执行以下操作,这对丹麦语字符应该没问题,但如果您有分解的字符,则会崩溃。我建议阅读字符串编程指南以获取更多信息。

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

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

于 2012-01-05T09:47:25.320 回答
0

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

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]; 
}
于 2012-01-05T09:45:33.090 回答
-1

它正在打印字符的unicode。无论如何,您可以在任何地方使用 unicode(带有 \u)。

于 2012-01-05T09:44:06.573 回答