【问题标题】:How do I split a string with special characters into a NSMutableArray如何将带有特殊字符的字符串拆分为 NSMutableArray
【发布时间】:2012-01-05 09:37:32
【问题描述】:

我正在尝试将带有丹麦字符的字符串分隔成 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,我会得到一些非常奇怪的字符 - 有什么问题?

/莫腾

【问题讨论】:

  • 太糟糕了,谁对这个线程中的所有内容都投了反对票,因为 IMO 这是一个好问题。

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


【解决方案1】:

首先,您的代码不正确。 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 方法的默认字符串化行为。如果您想看到“普通字符”,您可以将这些 un​​icode 字符一个一个打印出来:

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

【讨论】:

    【解决方案2】:

    在您的示例中,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]; 
    }
    

    【讨论】:

      【解决方案3】:

      您可以执行以下操作,这对于丹麦语字符应该没问题,但如果您有分解的字符,则会崩溃。我建议阅读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];
      }
      

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2016-03-03
          • 2021-07-02
          • 2020-05-18
          • 2022-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多