我有一个游戏,可以呈现玩家的昵称。
通常,我使用漂亮的样式位图字体来呈现昵称。但是,我只有“普通”字符的位图 - 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"
这样的序列......
答案 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;
}