Iphone 字符串中大写的第一个字母

Iphone 字符串中大写的第一个字母,iphone,ios,uppercase,Iphone,Ios,Uppercase,如何将NSString的第一个字母大写,并删除任何重音符号 例如,Alter,Alter,Alter应该变成Alter 但是,/lter,)lter,:lter应该保持不变,因为第一个字符不是字母 请不要使用此方法。因为一个字母在不同的语言中可能有不同的计数。你可以查看dreamlax的答案。但我相信你会从我的回答中学到一些东西。快乐编码:) 我为什么要关心字母的数量? 如果您尝试访问(例如NSMakeRange,substringToIndex等) 空字符串(如@“)中的第一个字符,则应用程序

如何将NSString的第一个字母大写,并删除任何重音符号

例如,
Alter
Alter
Alter
应该变成
Alter


但是,
/lter
)lter
:lter
应该保持不变,因为第一个字符不是字母

请不要使用此方法。因为一个字母在不同的语言中可能有不同的计数。你可以查看dreamlax的答案。但我相信你会从我的回答中学到一些东西。快乐编码:)

我为什么要关心字母的数量?

如果您尝试访问(例如
NSMakeRange
substringToIndex
等) 空字符串(如
@“
)中的第一个字符,则应用程序将崩溃。为了避免这种情况,您必须在对其进行处理之前验证它是否存在

如果我的字符串是零呢? 奈尔先生:我是‘零’。你寄给我的任何东西我都能消化。我不会允许你的应用程序自行崩溃。;)

nil
将观察您发送给它的任何方法调用


因此,它将消化您在其上尝试的任何内容,
nil
是您的朋友。

由于您希望删除变音符号,您可以与常见的字符串操作方法结合使用,如下所示:

/* create a locale where diacritic marks are not considered important, e.g. US English */
NSLocale *locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en-US"] autorelease];

NSString *input = @"Àlter";

/* get first char */
NSString *firstChar = [input substringToIndex:1];

/* remove any diacritic mark */
NSString *folded = [firstChar stringByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:locale];

/* create the new string */
NSString *result = [[folded uppercaseString] stringByAppendingString:[input substringFromIndex:1]];

我会列出一个步骤清单,我想你可以用它来完成这件事。希望你能毫无疑问地坚持下去!:)

  • 使用
    decomposedStringWithCanonicalMapping
    分解任何重音符号(重要的是确保重音符号不会被不必要地删除)
  • 使用字符索引:要提取第一个字母(索引0),请使用
    大写字符串
    将其转换为国会大厦字母,并使用
    stringByReplacingCharactersInRange
    将第一个字母替换回原始字符串
  • 在此步骤中,在将其转换为大写之前,您可以检查第一个字母是否是您不想替换的字符之一,例如“:”或“;”,如果是,则不要继续执行其余过程
  • 执行一个
    [字符串字符串通过replacingoccurrencesofstring:@“
    ”with string:@”“]排序调用,以删除任何剩余的重音符号

这一切都应该大写你的第一个字母,并删除任何重音:)

你可以使用
NSString

或(iOS 6.0及以上版本):


我在类似情况下使用此方法,但我不确定问题是否要求其他字母小写

- (NSString *)capitalizedOnlyFirstLetter {

    if (self.length < 1) {
        return @"";
    }
    else if (self.length == 1) {
        return [self capitalizedString];
    }
    else {

        NSString *firstChar = [self substringToIndex:1];
        NSString *otherChars = [self substringWithRange:NSMakeRange(1, self.length - 1)];

        return [NSString stringWithFormat:@"%@%@", [firstChar uppercaseString], [otherChars lowercaseString]];
    }
}
-(NSString*)大写首字母{
如果(自身长度<1){
返回@”;
}
else if(self.length==1){
返回[自资本化];
}
否则{
NSString*firstChar=[self substringToIndex:1];
NSString*otherChars=[self substringWithRange:NSMakeRange(1,self.length-1)];
返回[NSString stringWithFormat:@“%@%@”,[firstChar uppercaseString],[otherChars lowercaseString];
}
}

仅为了添加一些选项,我使用此类别将
NSString
的第一个字母大写

@interface NSString (CapitalizeFirst)
    - (NSString *)capitalizeFirst;
    - (NSString *)removeDiacritic;
@end

@implementation NSString (CapitalizeFirst)
- (NSString *)capitalizeFirst {
    if ( self.length <= 1 ) {
        return [self uppercaseString];
    }
    else {
        return [[[[self substringToIndex:1] removeDiacritic] uppercaseString] stringByAppendingString:[[self substringFromIndex:1] removeDiacritic]];
        // Or: return [NSString stringWithFormat:@"%@%@", [[[self substringToIndex:1] removeDiacritic] uppercaseString], [[self substringFromIndex:1] removeDiacritic]];
    }
}

- (NSString *)removeDiacritic { // Taken from: http://stackoverflow.com/a/10932536/1986221
    NSData *data = [NSData dataUsingEncoding:NSASCIIStringEncoding
                       allowsLossyConversion:YES];
    return [[NSString alloc] initWithData:data
                                 encoding:NSASCIIStringEncoding];
}
@end

自iOS 9.0以来,有一种使用当前语言环境将字符串大写的方法:

@property(readonly, copy) NSString *localizedCapitalizedString;

大写字符串只更改了第一个字母,因此选择它是无用的。问题是它不能消除重音。ThankscapitalizedString将NSString中每个单词的第一个字母大写。这个答案对于只大写一个句子的第一个字母很有用。虽然非常简单,但解决方案是错误的。想象一种情况,几个字母应该大写,而不仅仅是第一个字母。这里的一个很好的例子是Dutch及其IJ对。当涉及到大写时,您应该始终使用locale。同样,这并不能完全回答OP的问题。这仅大写第一个字符,但不删除变音符号。使用硬编码的
NSMakeRange(0,1)
是不正确的(因为第一个字母可能跨越多个字符)。有关解决方案,请参阅@dreamlax答案中的我的评论。
capitalizedString
在iOS 2.0版本中可用。所有字母都用小写,第一个字母只用大写one@VanDuTran:除了它没有完全回答OPs问题(指定删除任何重音)。此解决方案有一个潜在问题:对于给定的字符串
\u whatever
,它将转换为
\u whatever
。被否决。一些语言,例如荷兰语,有向图,如IJ,因此需要两个字母的大写:@AliakseiN.:原始问题中没有指定。OP希望删除变音符号并仅大写第一个字母,因此我假设他/她不希望保留任何特定于语言环境的正字法。此代码存在一个小错误,因为它假设第一个字母的长度为1个字符,这对于UTF字符串来说是不正确的。相反,它应该调用
NSString*firstChar=[input substringWithRange:[input rangeOfComposedCharacterSequenceAtIndex:0]
,然后使用
[input substringFromIndex:firstChar.length]
NSString *helloWorld  = @"hello world";
NSString *capitalized = [helloWorld capitalizeFirst];
NSLog(@"%@ - %@", helloWorld, capitalized);
@property(readonly, copy) NSString *localizedCapitalizedString;