1

UTF-16文字列(スパイダーモンキー19のJSStringから取得)をUTF-8文字列に変換しようとしています。変換された文字列は問題ないと思いますが、何らかの理由で、変換ルーチンはユニコード(非ASCII)文字ごとに2バイトを追加しています。私は何か間違ったことをしていると確信しています。別のエンコーディングを試しましたが、良い結果は得られませんでした。これは私が今得ているものです:

// UTF-16 string "áéíóúñ aeiou", this is the string being converted
// (you can find "aeiou" after \x20\x00, where \x61\x00 is "a")
\xC3\x00\xA1\x00\xC3\x00\xA9\x00\xC3\x00\xAD\x00\xC3\x00\xB3\x00\xC3\x00\xBA\x00\xC3\x00\xB1\x00\x20\x00\x61\x00\x65\x00\x69\x00\x6F\x00\x75\x00\x6E\x00

// UTF-8 string, test string, taken from:
// const char* cmp = "áéíóúñ aeiou"
// This is the result I'm looking for.
\xc3\xa1\xc3\xa9\xc3\xad\xc3\xb3\xc3\xba\xc3\xb1 aeiou

// UTF-8 string I'm getting after iconv(utf16, utf8)
\xc3\x83\xc2\xa1\xc3\x83\xc2\xa9\xc3\x83\xc2\xad\xc3\x83\xc2\xb3\xc3\x83\xc2\xba\xc3\x83\xc2\xb1 aeioun

ご覧のとおり、ASCII以外のすべての文字の間に2バイト(\ x83 \ xc2)余分にあります。誰もがそれがなぜなのか知っていますか?

これは私の変換ルーチンです:

shared_ptr<char> convertToUTF8(char* utf16string, size_t len) {
    iconv_t cd = iconv_open("UTF-8", "UTF-16LE");
    char* utf8;
    size_t utf8len;

    utf8len = len;
    utf8 = (char *)calloc(utf8len, 1);
    shared_ptr<char> outptr(utf8);

    size_t converted = iconv(cd, &utf16string, &len, &utf8, &utf8len);
    if (converted == (size_t)-1) {
        fprintf(stderr, "iconv failed\n");
        switch (errno) {
            case EILSEQ:
                fprintf(stderr, "Invalid multibyte sequence.\n");
                break;
            case EINVAL:
                fprintf(stderr, "Incomplete multibyte sequence.\n");
                break;
            case E2BIG:
                fprintf(stderr, "No more room (iconv).\n");
                break;
            default:
                fprintf(stderr, "Error: %s.\n", strerror(errno));
                break;
        }
        outptr = NULL;
    }
    iconv_close(cd);
    assert(outptr);
    return outptr;
}

この別の質問でも解決策を試しましたが、まったく同じ結果が得られました。iconvが2バイトを追加する理由はありますか?結果を手動で作成したutf-8文字列と一致させるにはどうすればよいですか?

編集:テスト文字列の説明を修正しました

4

1 に答える 1