如何检查NSString是否包含花哨的字符?

时间:2014-05-30 01:06:51

标签: objective-c nsstring

我有一个游戏,可以呈现玩家的昵称。

通常,我使用漂亮的样式位图字体来呈现昵称。但是,我只有“普通”字符的位图 - A,B,C,...,1,2,3,...!@#$%^,...。中文,日文或任何其他语言的其他“花哨”字符都没有位图。

尝试使用位图呈现此类文本会崩溃,因为我不提供此类位图。因此,我决定检测给定字符串是否是“奇特”字符串,如果是这种情况,请使用某些生成的系统字体呈现昵称。

如何检测字符串是否包含奇特的字符?我目前的解决方案就像

-(BOOL)isNormalText:(NSString *)text {
    char accepted[] = {"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+{}/\\\"\'?.,"};
    for (int i = 0; i < [text length]; ++i) {
        char character = [text characterAtIndex:i];
        BOOL found = NO;
        for (int j = 0; j < 84 && !found; ++j) {
            char acceptedChar = accepted[j];
            if (character == acceptedChar) {
                found = YES;
            }
        }
        if (!found) {
            return NO;
        }
    }
    return YES;
}

我认为 NOT 的工作原理。因为花哨的角色不是一个角色 - 它是一个类似"\u123"的序列。

我在Java中看到过类似的问题:How to check if the word is Japanese or English?

他们检查字符值是否在255范围内。但是当我在Objective-C中检查它时,它告诉我它是多余的,因为char总是在这样的范围内 - 这是有意义的,因为我想象花哨的字符实际上是像"\u123"这样的序列......

2 个答案:

答案 0 :(得分:3)

使用NSCharacterSet,将其填入您拥有位图的字符,然后反转该设置,使其代表您 所拥有的所有字符。然后使用-[NSString rangeOfCharacterFromSet:]。如果它返回NSNotFound,则该字符串仅包含有效字符。

就像一个例子来说明我的意思:

- (BOOL) isNormalText:(NSString *) str
{
    if (str == nil)
        return NO;

    NSCharacterSet *allowedChars = [NSCharacterSet characterSetWithCharactersInString:@"ABCDEFG"];
    NSCharacterSet *notAllowedChars = [allowedChars invertedSet];

    return [str rangeOfCharacterFromSet:notAllowedChars].location == NSNotFound;
}

答案 1 :(得分:1)

使用正则表达式检查

-(BOOL)isNormalText:(NSString *)text {
   NSString * regex        = @"(^[A-Za-z0-9]*$)";
   NSPredicate * pred      = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
   BOOL isMatch            = [pred evaluateWithObject:text];
   return isMatch;
}