【发布时间】:2014-06-14 18:18:09
【问题描述】:
我编写了一个 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++;
}
}
目标 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?如何获取正确的位置?
谢谢!
【问题讨论】:
标签: ios objective-c c macos unicode