標準の char * で UTF-16LE としてエンコードされた結果文字列 (私はかなり確信しています) と、文字列内のバイト数を返す関数を持つライブラリを使用しています。これらの文字列を UTF-8 に変換したいと思います。私はこの質問から解決策を試しました: Windows と Linux で UTF-16 を UTF-8 に変換します。C ではiconv を使用するように指示されていますが、その結果、入力バッファーと出力バッファーの両方が空になりました。私は何が欠けていますか?
私の入力および出力バッファは、次のように宣言および初期化されます。
char *resbuff=NULL;
char *outbuff=NULL;
int stringLen;
size_t outbytes=1024;
size_t inbytes;
size_t convResult;
...
//some loop and control code here
...
if (resbuff==NULL) {
resbuff=(char *)malloc(1024);
outbuff=(char *)malloc(1024);
}
次に、ライブラリ関数を呼び出して、rebuff にデータを入力します。デバッガーでバッファーを見ると、バッファー内のデータが表示されます。たとえば、データが「テスト」の場合、リバフの個々のインデックスを見ると、次のようになります。
't','\0','e','\0','s','\0','t','\0'
私が信じているのは UTF-16LE (同じライブラリを使用する他のコードがこれを確認するように見える) であり、stringlen は 8 に等しくなりました。次に、次のコードを使用してそれを UTF-8 に変換しようとします。
iconv_t conv;
conv=iconv_open("UTF-8", "UTF-16LE");
inbytes=stringLen;
convResult=iconv(conv,&resbuff,&inbytes,&outbuff,&outbytes); //this does return 0
iconv_close(conv);
その結果、outbuff と resbuff の両方が null 文字列になります。
ライブラリ関数が想定しているのは、stringlen を unsigned long ではなく int として宣言していることに注意してください。
編集: 以下の John Bollinger の回答に従って、コードを少し調整しましたが、結果は変わりませんでした。
編集 2: 最終的に、このコードからの出力は Python で使用されるため、見苦しいかもしれませんが、そこで文字列変換を実行するだけだと考えています。それだけで機能します。