gpt4 book ai didi

ios - 在 C 和 Objective C 中处理 unicode 字符串

转载 作者:行者123 更新时间:2023-11-29 03:00:32 25 4
gpt4 key购买 nike

我编写了一个 C 函数来读取用户输入字符串中的字符。因为这个字符串是用户输入的,所以它可以包含任何 unicode 字符。 Objective C 有一个方法接收用户输入的 NSString,然后将此字符串转换为 NSData,并将此数据传递给 C 函数进行处理。 C 函数搜索这些符号字符:*、[、]、_,它不关心任何其他字符。每次它找到其中一个符号时,它都会进行处理,然后调用 Objective C 方法,传递符号的位置。

C 代码:

typedef void (* callback)(void *context, size_t location);

void process(const uint8_t *data, size_t length, callback cb, void *context)
{
size_t i = 0;
while (i < length)
{
if (data[i] == '*' || data[i] == '[' || data[i] == ']' || data[i] == '_')
{
int valid = 0;
//do something, set valid = 1

if (valid)
cb(context, i);
}
i++;
}
}

objective-c 代码:

//a C function declared in .m file
void mycallback(void *context, size_t location)
{
[(__bridge id)context processSymbolAtLocation:location];
}

- (void)processSymbolAtLocation:(NSInteger)location
{
NSString *result = [self.string substringWithRange:NSMakeRange(location, 1)];
NSLog(@"%@", result);
}

- (void)processUserInput:(NSString*)string
{
self.string = string;
//convert string to data
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
//pass data to C function
process(data.bytes, data.length, mycallback, (__bridge void *)(self));
}

如果输入字符串仅包含英文字符,则代码可以正常工作。如果它包含组合字符序列、多字节字符或其他 unicode 字符,则 processSymbolAtLocation 方法中的结果字符串不是预期的符号。

如何正确地将NSString对象转换为NSData?如何获得正确的位置?

谢谢!

最佳答案

您的问题是您从一个 UTF-16 编码的 NSString 开始并生成一个 UTF-8 编码的字节序列。在 UTF-16 中表示字符串所需的代码单元数可能不等于在 UTF-8 中表示字符串所需的代码单元数,因此两种形式中的偏移量可能不匹配 - 正如您所发现的那样。

为什么首先要使用 C 来扫描字符串以查找匹配项?您可能需要查看 NSStringrangeOfCharacterFromSet:options:range: 方法,您可以使用该方法从您的集合中查找下一个出现的字符。

如果您需要使用 C,则将您的字符串转换为 UTF-16 单词序列,并在 C 端使用 uint16_t

HTH

关于ios - 在 C 和 Objective C 中处理 unicode 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23354016/

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