Macでpopen()コマンドを使用してファイルに対してプログラムを実行しようとしています。このため、私は<path-to_executable> <path-to-file>
という形式のコマンドを作成し、このコマンドでpopen()を呼び出します。今のところ、これら2つのコンポーネントは両方ともchar *で宣言されています。私はpopen()によって与えられたパイプが必要なので、コマンドの出力を読む必要があります。Mac上の中国語のコマンドでpopen()を呼び出す
これで、パスツーファイルには中国語、日本語、ロシア語、その他の文字を含めることができました。このために、私はwchar_t *としてファイルへのパスを表すことができます。明らかにMac/LinuxにはWindowsのような幅広い_wpopen()がないので、これはpopen()では機能しません。
私はこの作業を行うことができます他の方法はありますか?私はwchar_t *だけを与えることができるデータ構造からファイルへのパスを取得しているので、必要に応じてそこから取り出して適切に変換する必要があります。
ありがとうございます。
編集:
あなたは自分の髪を引っ張ってしまう当時の1のように思えます。
私はwcstombsを使ってみましたが、 "C.UTF-8"とその置換のいずれかでsetlocale呼び出しが失敗しました。当然のことながら、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は文字を変換せずに戻ります。
この問題をデバッグするために、入力文字列を一時文字列に変更し、入力の長さを適切に設定することさえできました。でもこれの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-encodingは正しいです。入力バッファにはいくつかの単純な文字が含まれています。すべてがハードコードされていますが、iconvは文字を変換せず、単に0を返し、outbufは空のままです。
サニタリーアラート!
Mac OSのファイル名はUTF-8でエンコードされているため、使用する必要があります。 – zneak