我试图在Mac上使用popen()命令在文件上执行程序。为此,我创建了一个形式为<path-to_executable> <path-to-file>
的命令,然后在此命令上调用popen()。现在,这两个组件都在char *中声明。我需要读取命令的输出,所以我需要popen()给出的管道。在Mac上使用中文字符命令调用popen()
现在事实证明,路径到文件可以包含中文,日文,俄文和几乎任何其他字符。为此,我可以将path-to-file表示为wchar_t *。但是这对popen()不起作用,因为显然Mac/Linux没有像Windows那样宽的_wpopen()。
有没有其他办法可以使这项工作?我从一个数据结构中获取path-to-file,这个数据结构只能给我wchar_t *,所以如果需要的话,我必须从中取出并适当地转换它。
在此先感谢。
编辑:
好像这些天,当你刚刚结束了拉你的头发之一。
所以我尝试使用wcstombs,但setlocale调用失败的“C.UTF-8”及其任何排列组合。不出所料,wcstombs调用失败后返回-1。
然后我试着根据Google上搜索到的一些示例代码编写我自己的iconv实现。我想出了这个,它顽固地拒绝工作:
iconv_t cd = iconv_open("UTF-8", "WCHAR_T");
// error checking here
wchar_t* inbuf = ...; // get wchar_t* here
char outbuf[<size-of-inbuf>*4+1];
size_t inlen = <size-of-inbuf>;
size_t outlen = <size-of-inbuf>*4+1;
char* c_inbuf = (char*) inbuf;
char* c_outbuf = outbuf;
int ret = iconv(cd, &c_inbuf, &inlen, &c_outbuf, &outlen);
// more error checking here
的iconv总是返回-1,errno设置为EINVAL。我已验证<size-of-len>
设置正确。我不知道为什么这段代码现在失败了。
编辑2:
的iconv是失败,因为我没有设置输入缓冲器长度权。此外,Mac似乎不支持“WCHAR_T”编码,因此我将其更改为UTF-16。现在我已经修正了长度并且改变了编码,但是iconv只是返回而没有转换任何字符。它只返回0.
要调试此问题,我甚至将输入字符串更改为临时字符串并适当地设置输入长度。我的代码现在看起来像:
iconv_t cd = iconv_open("UTF-8", "UTF-16");
// error checking here
wchar_t* inbuf = ...; // get wchar_t* here - guaranteed to be UTF-16
char outbuf[<size-of-inbuf>*4+1];
size_t inlen = <size-of-inbuf>;
size_t outlen = <size-of-inbuf>*4+1;
char* c_inbuf = "abc"; // (char*) inbuf;
inlen = 4;
char* c_outbuf = outbuf;
int ret = iconv(cd, &c_inbuf, &inlen, &c_outbuf, &outlen);
// more error checking here
我已经确认转换器描述符正在打开正确。源编码是正确的。输入缓冲区包含几个简单字符。一切都是硬编码的,而且iconv不会转换任何字符,只是返回0,并且outbuf保持空白。
完美损失警报!
Mac OS文件名以UTF-8编码,所以这就是你应该使用的。 – zneak 2012-02-02 18:14:06