Ios 检测占用NSString中多个索引点的字符的方法?

Ios 检测占用NSString中多个索引点的字符的方法?,ios,cocoa-touch,nsstring,Ios,Cocoa Touch,Nsstring,我想知道,有没有一种方法可以检测一个字符串中占用超过1个索引点的字符?(像表情符号)。我正在尝试实现一个自定义文本视图,当用户按下delete键时,我需要知道是否应该只删除前一个或多个索引点。实际上NSString使用UTF-16。因此,处理需要两个UTF-16字符(unichar)的字符非常困难但您可以使用rangeOfComposedCharacterSequenceAtIndex获取范围,而不是删除 首先从字符串中找到最后一个字符索引 NSUInteger lastCharIndex =

我想知道,有没有一种方法可以检测一个字符串中占用超过1个索引点的字符?(像表情符号)。我正在尝试实现一个自定义文本视图,当用户按下delete键时,我需要知道是否应该只删除前一个或多个索引点。

实际上
NSString
使用
UTF-16
。因此,处理需要
两个UTF-16字符(unichar)的字符非常困难但您可以使用
rangeOfComposedCharacterSequenceAtIndex
获取范围,而不是删除

首先从字符串中找到最后一个字符索引

NSUInteger lastCharIndex = [str length] - 1; 
然后获取最后一个字符的范围

NSRange lastCharRange = [str rangeOfComposedCharacterSequenceAtIndex: lastCharIndex];
然后删除,范围从字符开始(如果是两个UTF-16,则删除UTF-16)


您可以将此方法用于任何类型的
字符,这些字符可以使用任意数量的unichar

实际上
NSString
使用
UTF-16
。因此,使用
两个UTF-16字符(unichar)的字符非常困难但您可以使用
rangeOfComposedCharacterSequenceAtIndex
获取范围,而不是删除

首先从字符串中找到最后一个字符索引

NSUInteger lastCharIndex = [str length] - 1; 
然后获取最后一个字符的范围

NSRange lastCharRange = [str rangeOfComposedCharacterSequenceAtIndex: lastCharIndex];
然后删除,范围从字符开始(如果是两个UTF-16,则删除UTF-16)


您可以对任何类型的
字符使用此方法,这些字符使用任意数量的unichar

作为一个字符,您可以使用
[myString UTF8String]
将字符串转换为字符序列,然后可以检查字符的第一位是否设置为1或0。如果是一个,那么这是一个UTF8字符,然后你可以检查这个字符有多少字节。有关UTF8的详细信息,请访问。下面是一个简单的例子:

NSString *string = @"ČTest";
const char *str = [string UTF8String];
NSMutableString *ASCIIStr = [NSMutableString string];

for (int i = 0; i < strlen(str); ++i)
    if (!(str[i] & 128))
        [ASCIIStr appendFormat:@"%c", str[i]];

NSLog(@"%@", ASCIIStr); //Should contain only ASCII characters
NSString*string=@“ČTest”;
const char*str=[string UTF8String];
NSMutableString*ASCISTR=[NSMutableString];
对于(int i=0;i
对于其中一个,您可以使用
[myString UTF8String]
将字符串转换为字符序列,然后检查字符的第一位是否设置为1或0。如果是一个,那么这是一个UTF8字符,然后你可以检查这个字符有多少字节。有关UTF8的详细信息,请访问。下面是一个简单的例子:

NSString *string = @"ČTest";
const char *str = [string UTF8String];
NSMutableString *ASCIIStr = [NSMutableString string];

for (int i = 0; i < strlen(str); ++i)
    if (!(str[i] & 128))
        [ASCIIStr appendFormat:@"%c", str[i]];

NSLog(@"%@", ASCIIStr); //Should contain only ASCII characters
NSString*string=@“ČTest”;
const char*str=[string UTF8String];
NSMutableString*ASCISTR=[NSMutableString];
对于(int i=0;i
不难知道一个字符占用多少字节。如果您将字符串转换为
UTF8
char数组,如果您对UTF8编码有一点了解,那就相当容易了。正如问题所述,如何删除字符,这样这个方法就可以做到。它可以删除任何
unicode
字符,使用任何数量的
unichars
。无需转换
UTF8
或使用
UTF8
不难知道一个字符占用多少字节。如果您将字符串转换为
UTF8
char数组,如果您对UTF8编码有一点了解,那就相当容易了。正如问题所述,如何删除字符,这样这个方法就可以做到。它可以删除任何
unicode
字符,使用任何数量的
unichars
。无需转换
UTF8
或使用
UTF8
@trojanfoe-无论标准是什么?我只是在处理一个普通的NSString,没什么特别的。这里有一个类似的问题:。你需要明确你的意思是不是2字节长(哪一个是一个Objective-C
CHAR
或2
CHAR
s长。@HotLicks-我的意思是2个CHAR长,那么我应该改为4个字节吗?@特洛伊木马-不管标准是什么?我只是在处理一个常规的NSString,没有什么特别之处。这里有类似的问题:。你需要具体说明你是否指2个字节长(哪个是一个Objective-C
CHAR
或2
CHAR
s长。@HotLicks-我的意思是2个CHAR长,所以我应该改为4个字节吗?