【问题标题】:Replace letters in a string替换字符串中的字母
【发布时间】:2012-05-31 03:08:15
【问题描述】:

您好,我有一个问题,我不知道如何解决。问题是我什至不知道如何用谷歌搜索它。我已经在互联网上花费了数小时寻找解决方案,但没有成功。情况是这样的:

我有字符串,可以说:

NSString *string = @"aąbcčdeęėfghiįjzž";

我的结果必须是这样的:

NSString *string = @"aabccdeeefghiujzz";

所以如果你明白我必须这样做:

将ą替换为a

将 č 替换为 c

把ė换成e

把ę换成e

等等……

也许有人可以帮助我吗?我有一个答案,但它不是很优化,我希望有一些更方便的解决方案。

提前致谢!

【问题讨论】:

标签: objective-c ios nsstring replace


【解决方案1】:

让框架为您完成转换:

NSString *blah = @"aąbcčdeęėfghiįjzž";
NSData *data = [blah dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *newblah = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"new: %@", newblah);

此日志:

new: aabccdeeefghiijzz

【讨论】:

  • 呃……我喜欢这很容易,但哇,感觉就像黑魔法。这种行为可靠吗?
  • @JefferyThomas 根据文档,this is why the method exists。所以是的,我会说它是可靠的。 :)
  • 这很好。对不起,我应该在问之前先有 RTFM。
  • @JefferyThomas 一切都好。框架很大,熟悉所有有趣的细节需要很长时间。我一直在寻找整洁的小东西。
  • 如果有人会踩到它,我找到了另一种更简单的方法。在我的情况下,我需要查找字符串是否包含另一个忽略我指定的字母的字符串,所以我是这样做的:NSString *fullStr = item.infoText; NSRange range = [fullStr rangeOfString:search options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch]; if (range.location != NSNotFound) { NSLog(@"String found!"); }
【解决方案2】:

这将起作用:

NSString *str = @"aąbcčdeęėfghiįjzž";
NSLog(@"%@", str);
NSMutableString *s = [[str decomposedStringWithCompatibilityMapping] mutableCopy];
NSUInteger pos = 0;
while(pos < s.length) {
    NSRange r = [s rangeOfComposedCharacterSequenceAtIndex:pos];
    if (r.location == NSNotFound) break;
    pos = ++r.location;
    if (r.length == 1) continue;
    r.length--;
    [s deleteCharactersInRange:r];
}
NSLog(@"%@", s);

这个想法是首先将每个带有变音标记的字符分解为其基本字符序列和Unicode combining diacritical marks序列(由decomposedStringWithCompatibilityMapping完成),然后遍历字符串,并删除所有这些标记一个(这就是循环所做的)。

【讨论】:

  • @DaveDeLong 谢谢!我也喜欢你的 - 将字符串硬塞进 ASCII 并将其拉回的想法非常可爱。
【解决方案3】:

我只能提供这个:

[string stringByReplacingOccurrencesOfString:@"ą" withString:@"a"];

等等……

【讨论】:

    【解决方案4】:

    Dave DeLong 的答案会将“æ”替换为“ae”,将“ß”替换为“s”,但不会替换连字 –、ij、ff、fi、f、ffi、ffl、ſt、st、.. .

    一个改进的解决方案是添加三行映射来处理一切正常:

    blah = [blah stringByReplacingOccurrencesOfString:@"Œ" withString:@"OE"];
    blah = [blah stringByReplacingOccurrencesOfString:@"œ" withString:@"oe"];
    blah = [blah precomposedStringWithCompatibilityMapping];
    
    NSData *data = [blah dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *newblah = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2014-09-03
      • 2017-07-09
      • 2022-09-24
      相关资源
      最近更新 更多