Objective c 分析iOS中的引号和双引号问题

Objective c 分析iOS中的引号和双引号问题,objective-c,parsing,ios9,double-quotes,xcode8,Objective C,Parsing,Ios9,Double Quotes,Xcode8,我有一个textview,它可以接受任何输入,我需要将引号和双引号解析为&apos和“。因此,如果我在文本视图中输入一个文本,比如“Just testin'g quotes”,那么输出应该是“Just testin'g quotes“下面是我的解析代码,到目前为止效果很好 -(NSString *)parseQuotes:(NSMutableString *)str { [str replaceOccurrencesOfString:@"\"" withString:@"&am

我有一个textview,它可以接受任何输入,我需要将引号和双引号解析为
&apos
。因此,如果我在文本视图中输入一个文本,比如“Just testin'g quotes”,那么输出应该是
“Just testin'g quotes“
下面是我的解析代码,到目前为止效果很好

-(NSString *)parseQuotes:(NSMutableString *)str {
    [str replaceOccurrencesOfString:@"\"" withString:@""" options:0 range:NSMakeRange(0, [str length])];
    [str replaceOccurrencesOfString:@"'" withString:@"'" options:0 range:NSMakeRange(0, [str length])];

    return str;
}
所以,现在我的问题是,如果我复制粘贴一个文本,如下所示

“只是测试引用”

“只是测试引用”

它给我一个输出,比如

“Just testin’g quotes” 

"Just testin'g quotes"
注意第一个没有解析,因为它有不同格式的引号和双引号

    [str replaceOccurrencesOfString:@"“" withString:@""" options:0 range:NSMakeRange(0, [str length])];

    [str replaceOccurrencesOfString:@"”" withString:@""" options:0 range:NSMakeRange(0, [str length])];

    [str replaceOccurrencesOfString:@"’" withString:@"'" options:0 range:NSMakeRange(0, [str length])];

这是可行的,但我需要知道这是否是正确的继续方式?是否有可能出现不同类型的报价并打破此代码?是否有更好的替代解决方案适用于所有类型的报价?

当潜在的替代方案集可能会发生变化时,处理此问题的一个好方法是使用
c组件按字符分隔设置:
用于潜在替换

static NSCharacterSet *characterSet = [NSCharacterSet
    characterSetWithCharactersInString:@"\"''ʺ˝ˮ˶״᳓“”‟″‶〃""];
NSString *newStr = [[str componentsSeparatedByCharactersInSet:characterSet] componentsJoinedByString:@"""]

首先定义映射:

NSMutableDictionary *mapping = [NSMutableDictionary dictionary];
mapping[@"\""] = @""";
mapping[@"”"] = @""";
...

for (NSString *key in mapping) {
    [str replaceOccurrencesOfString:key withString:mapping[key] options:0 range:NSMakeRange(0, [str length])];
}
这是一个易于扩展的解决方案


如果不使用
replaceCurrencesofString:with字符串:
,您可能只需要迭代字符并分别检查每个字符,以提高性能。

?可能是出于某些要求,您需要将引号替换为
。不同的需求将为您提供需要替换的不同引号集(您不会在所有可能的UTF字符表中替换所有类型的引号,对吗?)。您的案例有什么要求?@AndrewTomenko,基本上用户可以在textview中键入或粘贴任何类型的内容。所以,我需要处理他们可以粘贴的任何类型的引号。@GamerGend用户可以粘贴非常广泛的字符,这些字符可以称为引号。但从发展的角度来看,一般来说,没有必要全部处理。例如,如果要将用户输入存储在xml中,并且需要转义引号,则只需要转义引号的一个版本,即
character。不可变字符串也会更快,但在这种情况下,应用程序似乎正在处理用户输入,小到任何合理的内容都可以实时运行。@danh现在即使是长文本也可以快速完成。这完全取决于数字或替换。这还取决于是否要替换字符序列,例如,将3个文字点替换为
&hellip
。单引号需要替换为'