我試圖在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