【问题标题】:Way to detect character that takes up more than one index spot in an NSString?检测在 NSString 中占用多个索引点的字符的方法?
【发布时间】:2014-07-27 13:00:38
【问题描述】:

我想知道,有没有办法检测在 NSString 中占据超过 1 个索引点的字符? (如表情符号)。我正在尝试实现自定义文本视图,当用户推送删除时,我需要知道是否应该只删除前一个索引点或更多。

【问题讨论】:

  • @trojanfoe - 无论标准是什么?我只是在使用常规的 NSString,没什么特别的。
  • 您需要具体说明您的意思是 2 个字节长(即 1 个 Objective-C CHAR 或 2 个 CHARs 长。
  • @HotLicks - 我的意思是 2 个字符长,所以我应该改为 4 个字节吗?

标签: ios cocoa-touch nsstring


【解决方案1】:

实际上NSString 使用UTF-16。因此很难使用带有two UTF-16 charater(unichar) or more 的字符。但是您可以使用rangeOfComposedCharacterSequenceAtIndex 来获取范围而不是删除。

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

NSUInteger lastCharIndex = [str length] - 1; 

比获取最后一个字符的范围

NSRange lastCharRange = [str rangeOfComposedCharacterSequenceAtIndex: lastCharIndex];

比从字符范围删除(如果是两个 UTF-16 则删除 UTF-16)

deletedLastCharString = [str substringToIndex: lastCharRange.location];

您可以将此方法与任何类型的 characters 一起使用,它需要任意数量的 unichar

【讨论】:

  • 不难发现一个字符占用了多少字节。如果您将字符串转换为 UTF8 char 数组,如果您对 UTF8 编码有所了解,则相当容易。
  • 正如问题所说,如何删除字符,所以这个方法可以做到这一点。它可以删除任意数量的unichars 的任何unicode 字符。无需转换UTF8 或使用@987654333 @
【解决方案2】:

您可以使用[myString UTF8String] 将字符串转换为字符序列,然后您可以检查字符的第一位是否设置为1 或0。如果它是一个,那么这是一个 UTF8 字符,然后您可以检查该字符有多少字节。有关 UTF8 的详细信息,请访问 Wikipedia - 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多