似乎NSTask
调用-[NSString fileSystemRepresentation]
来为您提供的每个参数编码值。
由于 -fileSystemRepresentation
使用分解的unicode格式进行编码,因此在某些情况下会出现问题:例如,a-umlaut(ä)将被编码为U + 0061(拉丁文小写字母a)和U + 0308(结合分音符),而不是U + 00E4(带有分音符的拉丁文小写字母a)。另一方面,-UTF8String
方法似乎恰恰相反。
我需要使用组合表单对NSTask
个参数进行编码。我该如何解决这个问题?
答案 0 :(得分:4)
一个可能的解决方案是子类NSString
并提供你自己的-fileSystemRepresentation
实现,但不幸的是NSString
是一个类集群,因此很难进行子类化(也不鼓励Apple的文档)。
但是,我们可以创建一个单独的类构成作为NSString
,但提供自己的-fileSystemRepresentation
实现。
但是,如果NSTask
对参数对象的类标识执行任何操作,则会产生问题。目前我没有证据证明这种情况 - 这种解决方法似乎完美无缺。
部首:
// MYTaskArgument.h
@interface MYTaskArgument : NSObject
+ (instancetype) taskArgumentWithString:(NSString *)str;
@end
实现:
// MYTaskArgument.m
@interface MYTaskArgument ()
@property(copy) NSString *string;
@end
@implementation MYTaskArgument
+ (instancetype) taskArgumentWithString:(NSString *)str {
MYTaskArgument *ret = [[MYTaskArgument alloc] init];
ret.string = str;
return ret;
}
- (const char *) fileSystemRepresentation {
return self.string.UTF8String;
}
- (id) forwardingTargetForSelector:(SEL)aSelector {
return self.string;
}
@end