【问题标题】:NSTask output special characters convert to UTF8NSTask 输出特殊字符转换为 UTF8
【发布时间】:2015-12-12 21:05:55
【问题描述】:

我正在通过 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 的方法。

【问题讨论】:

    标签: macos cocoa utf-8 nstask


    【解决方案1】:

    我发现将环境变量 LC_ALL 设置为 en_US.UTF-8 可以解决问题。

    [task setEnvironment:@{@"LC_ALL" : @"en_US.UTF-8"}];
    

    【讨论】:

    • 不幸的是,这对我不起作用,NSTask 仍然会产生分解的 utf-8。
    • 谢谢!这让我发疯了。这对我有用。
    【解决方案2】:

    它对我有用。

        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];
    

    【讨论】:

    • 您能否解释一下您的代码在做什么以及为什么它可以解决问题。
    【解决方案3】:

    在 Swift 中,NSTaskProcess 替换:

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

    【讨论】:

      猜你喜欢
      • 2019-11-04
      • 2018-11-23
      • 2013-03-08
      • 2016-02-27
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      相关资源
      最近更新 更多