0

以下のように、UTF-16LE 文字列 'TEST' とその 16 進ダンプがあります。

フェフ 0074 0065 0073 0074 000a

bash でコマンド iconv を使用してこの文字列を UTF-8 に変換すると、問題なく変換されます。

6574 7473 000a

しかし、C プログラムで同じことを行うと、文字 'T' で 0x00 が検出されるとすぐに、文字列の長さを 12 ( bom および null 終端)。

65 000a

以下は、私がテストしているコードです。ただし、任意のサイズのワイド char 文字列を変換すると (間に 0x00 バイトがない場合)、正しい出力が返されます。

char *cOutput;    // Output buffer with more enough size required
size_t tOutput; 
char *cInput;     // string wide characters
size_t tInput;
iconv_t cd;

........

cd = iconv_open("UTF8//TRANSLIT", "UTF-16LE");
iconv(cd, &cInput, &tInput, &cOutput, &tOutput);

この問題の解決策はありますか、それとも何か間違っているのでしょうか? 任意の入力をいただければ幸いです。

4

1 に答える 1

1

おそらく、あなたの問題はtInput、おそらくstrlen(cInput).

このコードは、期待される出力を生成します。

#include <stdio.h>
#include <string.h>
#include <iconv.h>

int main()
{
    char utf16le_str[] = { '\xff', '\xfe', '\x74', '\x00', '\x65', '\x00',
        '\x73', '\x00', '\x74', '\x00', '\x0a', '\x00' };
    char dest_str[100];
    char *in = utf16le_str;
    char *out = dest_str;
    size_t inbytes = sizeof utf16le_str;
    size_t outbytes = sizeof dest_str;
    iconv_t conv = iconv_open("UTF-8//TRANSLIT", "UTF-16LE");

    if (conv == (iconv_t)-1) {
        perror("iconv_open");
        return 1;
    }

    if (iconv(conv, &in, &inbytes, &out, &outbytes) == (size_t)-1) {
        perror("iconv");
        return 1;
    }

    dest_str[sizeof dest_str - outbytes] = 0;
    puts(dest_str);

    return 0;
}
于 2013-06-28T11:15:06.980 に答える