在Objective-C中将大写字符串转换为标题大小写

Bre*_*nan 2 string objective-c casing

我创建了以下方法,该方法首先使用NSString上的内置convertStringToTitleCase方法,但它实际上只是将每个单词的第一个字母大写.我在.NET中看到TextInfo.ToTitleCase有一种方法可以尝试我想用Objective-C做什么,但也不尽如人意.

http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx

我写的开始的方法如下.你如何正确处理大写字符串?将数据库转换为全部大写/小写有帮助吗?

- (NSString *)convertStringToTitleCase:(NSString *)str {
    NSMutableString *convertedStr = [NSMutableString stringWithString:[str capitalizedString]];

    NSRange range = NSMakeRange(0, convertedStr.length);

    // a list of words to always make lowercase could be placed here
    [convertedStr replaceOccurrencesOfString:@" De " 
                                  withString:@" de " 
                                     options:NSLiteralSearch 
                                       range:range];

    // a list of words to always make uppercase could be placed here
    [convertedStr replaceOccurrencesOfString:@" Tv " 
                                  withString:@" TV " 
                                     options:NSLiteralSearch 
                                       range:range];

    return convertedStr;
}
Run Code Online (Sandbox Code Playgroud)

ric*_*ter 6

如注释中所述,您引用的.NET方法不执行"正确"的标题大小写(即,遵循以全部大写或全小写形式保留的异常单词列表),因此-[NSString capitalizedString]等同于你会得到.如果你想要例外的话,你必须编写自己的方法(或找到其他人做的,谷歌搜索NSString "title case"可能).

你的标题框的"正确"程度取决于你愿意抛出多少个异常单词.你想要它支持多少英语?其他语言怎么样?它还取决于你在分析单词界限方面走得多远 - 你可能希望"电视"保持全部上限,无论它是在引号中,在一个句子的结尾等等,但你可能也不会我希望"你有"出来"你'".

如果你想处理异常单词,你的反复运行计划replaceOccurrencesOfString...会越慢,你所拥有的异常单词就越多.(另外,在搜索/替换字符串中使用空格意味着您不会考虑其他可能需要的字边界.)

考虑可能有用NSRegularExpression,因为正则表达式已经具有非常强大的大小写和单词边界的概念.如果这对您不起作用,使用扫描程序在生成转换后的输出字符串时读取输入字符串将比运行多个搜索/替换操作更有效.


maz*_*maz 6

一个好的单行代码(不是一般的解决方案,在巨大的字符串上可能效率很低):

[[str lowercaseString] capitalizedString];
Run Code Online (Sandbox Code Playgroud)