Macos NSTask输出特殊字符转换为UTF8

Macos NSTask输出特殊字符转换为UTF8,macos,cocoa,utf-8,nstask,Macos,Cocoa,Utf 8,Nstask,我通过NSTask运行lsof,通过管道输出并读取NSData。然后,我使用以下数据创建NSString: [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 我看到的问题是,NSTask如何解释特殊字符。对于名为:!@$%的文件^±^&*()ľščťžýáíédocx 我得到以下结果:!@$%^\xc2\xb1^&*()l\xcc\x8cs\xcc\x8cc\xcc\x8ct\xcc\x8c

我通过NSTask运行lsof,通过管道输出并读取NSData。然后,我使用以下数据创建NSString:

[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
我看到的问题是,NSTask如何解释特殊字符。对于名为:
!@$%的文件^±^&*()ľščťžýáíédocx
我得到以下结果:
!@$%^\xc2\xb1^&*()l\xcc\x8cs\xcc\x8cc\xcc\x8ct\xcc\x8cz\xcc\x8cy\xcc\x81a\xcc\x81i\xcc\x81e\xcc\x81.docx

看起来像是用十六进制编码值分解的UTF8。不幸的是,我无法找到将其转换为正确的UTF8的方法。

我发现将环境变量LC_ALL设置为en_US.UTF-8就可以了

[task setEnvironment:@{@"LC_ALL" : @"en_US.UTF-8"}];
这对我有用

    NSTask *task = [[NSTask alloc] init];
    NSMutableDictionary * e = [NSMutableDictionary dictionaryWithDictionary:[[NSProcessInfo processInfo] environment]];
    [e setObject:@"en_US.UTF-8" forKey:@"LC_ALL"];
    [e setObject:@"en_US.UTF-8" forKey:@"LANG"];
    [task setEnvironment:e];

在Swift中,任务被过程取代:

let process: Process = Process()
process.environment = ["LC_ALL": "en_US.UTF-8"]

不幸的是,这对我不起作用,NSTask仍然会生成分解的utf-8。您能解释一下您的代码在做什么,以及为什么它解决了这个问题吗。