gpt4 book ai didi

ios - NSString 统一处理 "regular english alphabets"和表情符号或日语等字符

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:05:31 25 4
gpt4 key购买 nike

有一个 textView,我可以在其中输入字符。字符可以是 a、b、c、d 等,也可以是使用表情符号键盘添加的笑脸。

-(void)textFieldDidEndEditing:(UITextField *)textField{
NSLog(@"len:%lu",textField.length);
NSLog(@"char:%c",[textField.text characterAtIndex:0]);
}

目前,上述函数给出以下输出

if textField.text = @"qq"
len:2
char:q

if textField.text = @"😄q"
len:3
char:=

我需要的是

if textField.text = @"qq"
len:2
char:q

if textField.text = @"😄q"
len:2
char:😄

任何线索如何做到这一点?

最佳答案

由于 Apple 搞砸了表情符号(实际上是 0 以上的 Unicode 平面),这变得很困难。看来需要通过组合字符枚举才能得到实际长度。

注意:NSString 方法length 返回的不是字符数,而是unichars 中的代码单元(不是字符)数。参见 NSString and Unicode - Strings - objc.io issue #9 .

示例代码:

NSString *text = @"qqq😄rrr";
int maxCharacters = 4;

__block NSInteger unicharCount = 0;
__block NSInteger charCount = 0;
[text enumerateSubstringsInRange:NSMakeRange(0, text.length)
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
unicharCount += substringRange.length;
if (++charCount >= maxCharacters)
*stop = YES;
}];
NSString *textStart = [text substringToIndex: unicharCount];
NSLog(@"textStart: '%@'", textStart);

textStart: 'qqq😄'

另一种方法是使用 utf32 编码:

int byteCount = maxCharacters*4; // 4 utf32 characters
char buffer[byteCount];
NSUInteger usedBufferCount;
[text getBytes:buffer maxLength:byteCount usedLength:&usedBufferCount encoding:NSUTF32StringEncoding options:0 range:NSMakeRange(0, text.length) remainingRange:NULL];
NSString * textStart = [[NSString alloc] initWithBytes:buffer length:usedBufferCount encoding:NSUTF32LittleEndianStringEncoding];

在 2011 WWDC 的第 128 节 - 高级文本处理中对此有一些解释。

关于ios - NSString 统一处理 "regular english alphabets"和表情符号或日语等字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23788938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com