【问题标题】:NSTask string encoding problemNSTask 字符串编码问题
【发布时间】:2010-03-29 09:14:02
【问题描述】:

在我的程序中,我正在通过 NSTask 进行 grep-ing。出于某种原因,有时我不会得到任何结果(即使代码显然与从 CLI 运行的命令运行得很好),所以我检查了我的代码并在 Apple 的文档中发现,在向一个 NSTask 对象,“NSTask 对象将路径和参数中的字符串转换为适当的 C 样式字符串(使用 fileSystemRepresentation),然后通过 argv[] 将它们传递给任务”(snip)。

问题是我可能会使用诸如“Río Gallegos”之类的术语。可悲的是(正如我使用 fileSystemRepresentation 检查的那样),它经过了转换,结果是“RiÃÅo Gallegos”。

我该如何解决这个问题?

--瑞

【问题讨论】:

    标签: cocoa encoding nstask


    【解决方案1】:

    问题是我可能会使用诸如“Río Gallegos”之类的术语。可悲的是(正如我使用 fileSystemRepresentation 检查的那样),它经过了转换,结果是“RiÃÅo Gallegos”。

    这是一种可能的解释。您的意思是“Río Gallegos”被转换为“Ri\xcc\x81o Gallegos”——UTF-8 字节表示分解后的 i + 组合重音符号。

    您的问题是 grep 没有将这些字节解释为 UTF-8。 grep 正在使用其他编码——显然是 MacRoman。

    解决方案是告诉 grep 使用 UTF-8。这需要在 grep 任务的 environment 中设置 LC_ALL 变量。

    要使用的快速而肮脏的值是“en_US.UTF-8”;更合适的方法是获取用户主要preferred language 的语言代码,将连字符(如果有)替换为下划线,并在其末尾粘贴“.UTF-8”。

    【讨论】:

    • 感谢您的回答,但它不起作用...我也尝试在 grep 任务的环境中设置 LC_CTYPE 和 LANG 变量,但仍然没有运气。
    • 您如何确定 grep 以您在问题中显示的方式解释字节?
    • 通过 NSString 的 fileSystemRepresentation 方法和 NSLog() 语句。实验表明,只有没有“í”等“非标准”字符的字符串才有效。我知道这不是证据,但它是强有力的证据。
    • 你是如何查看 NSLog 输出的?
    • 使用 XCode 中的调试器控制台。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2012-02-22
    • 2019-11-17
    • 2020-04-04
    • 1970-01-01
    相关资源
    最近更新 更多