Я пытаюсь запустить программу для файла с помощью команды popen () на Mac. Для этого я создаю команду вида <path-to_executable> <path-to-file>
и затем вызываю popen () для этой команды. Прямо сейчас оба эти компонента объявлены в символе *. Мне нужно прочитать вывод команды, поэтому мне нужен канал, заданный popen ().
Теперь выясняется, что путь к файлу может содержать китайский, японский, русский и почти любые другие символы. Для этого я могу представить путь к файлу как wchar_t *. Но это не работает с popen (), потому что, по-видимому, Mac / Linux не имеет такого широкого _wpopen (), как Windows.
Есть ли другой способ сделать эту работу? Я получаю путь к файлу из структуры данных, которая может дать мне только wchar_t *, поэтому мне нужно взять его оттуда и соответствующим образом преобразовать, если это необходимо.
Заранее спасибо.
Edit:
Похоже, это был один из тех дней, когда ты просто вырывал свои волосы.
Поэтому я попытался использовать wcstombs, но вызов setlocale не удался для «C.UTF-8» и любой его перестановки. Неудивительно, что вызов wcstombs не смог вернуть -1 после этого.
Затем я попытался написать собственную реализацию iconv, основанную на некоторых примерах кода, найденных в Google. Я придумал это, которое упрямо отказывается работать:
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. Теперь я исправил длину и изменил кодировку from, но iconv просто возвращает без преобразования какого-либо символа. Он просто возвращает 0.
Чтобы отладить эту проблему, я даже изменил строку ввода на временную строку и соответственно установил длину ввода. Даже этот вызов 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
Я подтвердил, что дескриптор конвертера открывается правильно. Кодировка from верна. Входной буфер содержит несколько простых символов. Все жестко закодировано, и все же iconv не конвертирует никакие символы и просто возвращает 0, а outbuf остается пустым.
Предупреждение о потере рассудка!