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

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,我会得到一些非常奇怪的字符-出了什么问题?
/Morten

1
很遗憾,谁在这个帖子中投票否决了所有内容,因为在我看来,这是一个好问题。 - Jason Coco
4个回答

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

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

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

这将把字符串分割成单个字符的数组,假设所有的码点都是组合字符。


-1

它正在打印字符的Unicode。不管怎样,你可以在任何地方使用Unicode(带\u)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接