【问题标题】:Simple stringByReplacingOccurrencesOfString help issue简单的 stringByReplacingOccurrencesOfString 帮助问题
【发布时间】:2013-04-04 08:00:18
【问题描述】:

我想将字符串中的一些“非法”字符替换为另一个“合法”字符,我有以下代码:

- (NSString *) quitarTildes:(NSString *)aStr
{
    NSString *aux = aStr;
    NSString *invalid = @"áéíóúÁÉÍÓÚñÑ";
    NSString *valid = @"aeiouAEIOUnN";
    for (int i = 0; i < [invalid length]; i++)
        [aux stringByReplacingOccurrencesOfString: [NSString stringWithFormat:@"%c",[invalid characterAtIndex:i]] 
                                       withString: [NSString stringWithFormat:@"%c",[valid characterAtIndex:i]]];
    NSLog(@"%@",aux);
    return aux;
}

所有的非法字符仍然存在......

NSString *test = @"Hólá, Ésto es una prueba.";
test = [self quitarTildes: test];

NSLog,响应:

2013-04-04 08:58:52.896 GeoRuta_v1[1960:907] Hólá, Ésto es una prueba.

【问题讨论】:

    标签: ios objective-c replace nsstring


    【解决方案1】:

    来自文档:

    stringByReplacingOccurrencesOfString:withString: 返回一个新字符串 其中接收器中所有出现的目标字符串都是 替换为另一个给定的字符串。

    -(NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement

    所以:

    aux = [aux stringByReplacingOccurrencesOfString: [NSString stringWithFormat:@"%c",[invalid characterAtIndex:i]] 
                                           withString: [NSString stringWithFormat:@"%c",[valid characterAtIndex:i]]];
    

    【讨论】:

    • 当我这样做时,xcode 给了我一个关于返回值的错误,我解释该方法不返回,只是通过引用修改。我的错,我会试试的。
    【解决方案2】:

    实现目标的可能更简单的解决方案:

    NSString *test = @"Hólá, Ésto es una prueba. - áéíóúÁÉÍÓÚñÑ";
    test = [test stringByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:NULL];
    NSLog(@"%@", test);
    

    输出:

    Hola, Esto es una prueba. - aeiouAEIOUnN
    

    【讨论】:

    • @rokimoki:是的——你为什么不试试呢? (这可能取决于你所说的“非法”。它应该适用于所有带有变音符号的字符。)
    • 对 NSXMLParser 来说是非法的,但我发现这对我正在做的事情不起作用,因为我想再次输入重音,我的转换模式将 á 转换为 ::-a- ::(例如),然后我会将 ::-a-:: 转换为 á,我为什么要这样做?因为 NSXMLParser 不会解析变音符号,所以我搜索了很多答案并且任何人都工作过,只是希望我的方法运行。谢谢。
    • @rokimoki:您的问题是关于将“á”替换为“a”,现在您想将“á”替换为“::-a-::”(并返回)? - 我也很确定 NSXMLParser 如果你做得对的话,它可以处理变音符号(比较stackoverflow.com/a/14201660/1187415)。
    • 至少对我来说不是,如果我有,&lt;name&gt;Solumática&lt;/name&gt; 它将解析&lt;name&gt;Solum&lt;/name&gt;&lt;name&gt;ática&lt;/name&gt;,变音符号在那里,但我有两个标签,我的应用程序将无法运行。 @MartinR,但我已经用我的问题解决了它,我认为这是一个很好的解决方案,那些 XML 不会那么长......它将在不到 1 秒的时间内进行代码编码。 =)
    • @rokimoki:请看stackoverflow.com/a/14201660/1187415foundCharacters 委托方法可以为同一个元素多次调用,并且您必须连接字符串。这是正常的和记录在案的行为。另见stackoverflow.com/a/14987201/1187415
    【解决方案3】:

    一个。您为 characterAtIndex: 使用了错误的格式说明符。该方法返回 unicharnot char(原因很明显)。你必须使用%C(大写C)。

    两个。您正在返回原始字符串,而不是替换其字符。

    NSMutableString *tmp = [aStr mutableCopy];
    // ...
    [tmp replaceOccurrencesOfString:[NSString stringWithFormat:@"%C", [invalid characterAtIndex:i]] 
                         withString:[NSString stringWithFormat:@"%C", [valid characterAtIndex:i]]];
    

    【讨论】:

    • 好的,谢谢你的回答,这真的很有效很多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多