我创建了以下方法,该方法首先使用 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;
}
最佳答案
如注释中所述,您引用的 .NET 方法不执行“正确的”标题大小写(即遵循全部大写或全部小写的异常(exception)单词列表),因此 -[NSString CapitalizedString]
与您所得到的等效。如果您想要异常(exception)词,则必须编写自己的方法(或找到其他人,如 google search for NSString "title case"
可能)。
你的标题大小写的“正确”程度取决于你愿意抛出多少异常词。您希望它支持多少英语?其他语言呢?它还取决于您在分析单词边界方面走了多远——您可能希望“TV”保持全大写,无论它是否在引号中、在句子末尾等,但您也可能不这样做不希望“you've”变成“You'Ve”。
如果您想处理异常词,则重复运行 replaceOccurrencesOfString...
的计划会随着异常词越多而变慢。 (此外,在搜索/替换字符串中使用空格意味着您没有考虑您可能想要的其他单词边界。)
考虑 NSRegularExpression
可能会很有用,因为正则表达式已经具有非常强大的大小写和单词边界概念。如果这对您来说效果不佳,那么使用扫描器读取输入字符串同时生成转换后的输出字符串将比运行多个搜索/替换操作更有效。
关于objective-c - 在 Objective-C 中将大写字符串转换为标题大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10180035/