Iphone (#和#xFF9F;Д;゚;)是一个5个字母的单词。但在iOS中,[“长度”是7。为什么?
(#゚Д゚) 是一个5个字母的单词。但在iOS中,[@”(#゚Д゚)" 长度]为7Iphone (#和#xFF9F;Д;゚;)是一个5个字母的单词。但在iOS中,[“长度”是7。为什么?,iphone,ios,nsstring,uitextinput,Iphone,Ios,Nsstring,Uitextinput,(#゚Д゚) 是一个5个字母的单词。但在iOS中,[@”(#゚Д゚)" 长度]为7 为什么? 我正在使用修改UITextField或UITextView中的文本。当我将uitextange设置为5个字符长度时,它只能覆盖(#゚Д゚) . 那么,为什么会这样゚Д゚) 在UITextField和UITextView中看起来像5个字符的单词,但在NSString中看起来像7个字符的单词 在这种情况下,如何获得字符串的正确长度 1)正如评论中所述,您的字符串由5个组合字符序列(或字符簇,如果您愿意的话)
修改UITextField
或UITextView
中的文本。当我将uitextange设置为5个字符长度时,它只能覆盖(#゚Д゚) . 那么,为什么会这样゚Д゚) 在UITextField
和UITextView
中看起来像5个字符的单词,但在NSString中看起来像7个字符的单词unichar
s分解为NSString
的length
方法时,您将得到一个7,它是表示内存中字符串所需的unichar
s数
2)显然UITextField
和UITextView
正在以unichar-savy的方式处理字符串。好消息,你也可以。参见#3
3)您可以使用一些正确处理组合字符序列的NSString
API来获得组合字符序列的数量。我很快就想到了一个小的NSString
类别:
@implementation NSString (ComposedCharacterSequences_helper)
-(NSUInteger)numberOfComposedCharacterSequences{
__block NSUInteger count = 0;
[self enumerateSubstringsInRange:NSMakeRange(0, self.length)
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){
NSLog(@"%@",substring); // Just for fun
count++;
}];
return count;
}
@end
同样,这是一个快速代码;但它应该让您开始。如果您这样使用它:
NSString *string = @"(# ゚Д゚)";
NSLog(@"string length %i", string.length);
NSLog(@"composed character count %i", [string numberOfComposedCharacterSequences]);
你会看到你得到了想要的结果
有关
NSString
API的深入解释,请查看WWDC 2012年第215次会议视频“文本和语言分析”
两者゚代码>和<代码>Б゚
由两个Unicode字符的组合表示(即使它们在视觉上显示为一个字符)。-[NSString length]
报告Unicode字符的数量:
返回的数字包括组合的单个字符
字符序列,因此不能使用此方法确定
打印时字符串将可见或显示多长时间
如果要查看字节表示形式,请执行以下操作:
#import <Foundation/Foundation.h>
NSString* describeUnicodeCharacters(NSString* str)
{
NSMutableString* codePoints = [NSMutableString string];
for(NSUInteger i = 0; i < [str length]; ++i){
long ch = (long)[str characterAtIndex:i];
[codePoints appendFormat:@"%0.4lX ", ch];
}
return codePoints;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
NSString *s = @" ゚Д゚";
NSLog(@"%ld unicode chars. bytes: %@",
[s length], describeUnicodeCharacters(s));
}
}
#导入
NSString*DescribeUnicode字符(NSString*str)
{
NSMutableString*代码点=[NSMutableString];
对于(整数i=0;i<[str length];++i){
long ch=(long)[str characterAtIndex:i];
[码点格式:@“%0.4lX”,ch];
}
返回码点;
}
int main(int argc,char*argv[]){
@自动释放池{
NSString*s=@”゚Д゚";
NSLog(@“%ld个unicode字符.字节:%@),
[s长度],描述单个或多个字符);
}
}
输出为:4个unicode字符。字节:0020 FF9F 0414 FF9F
2) 和3):NJones说了什么。猜测一下,我会说字符编码-NSString计算字节数和字符数吗?也许你的两个字符实际上是多字节字符,而NSString出错了…正如前面所说,这是一个猜测(#゚Д゚) 如果复制并粘贴到文本编辑器中,则有7个字符。对我来说,它“看起来”像一个6个字符的单词,因为末尾有一个空格。但是“Б”゚“实际上是两个unicode字符。