почему iconv читает больше байтов, чем я указал - PullRequest
0 голосов
/ 01 июня 2011

Я использую

size_t iconv(iconv_t cd,   char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);

для преобразования UTF-16BE в GB2312.

inbytesleft - число байтов для преобразования. После преобразования inbytesleft - это число байтов не преобразованных.

После одного звонка я обнаружил, что inbytesleft равно -2, согласно manv-странице iconv эта функция должна читать не более inbytesleft. Кто подскажет, почему и как это исправить?

код для преобразования:

"保单验证"

Спасибо

1 Ответ

0 голосов
/ 02 июня 2011

Как вы получаете входные данные в вашу программу?

Я протестировал ситуацию, используя этот код, и похоже, что он работает:

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

int main(){
    char data[10] = {0x4f,0xdd,0x53,0x55,0x9a,0x8c,0x8b,0xc1, 0, 0};
    char outdata[20];
    char *dataptr;
    char *outdataptr;
    iconv_t cd;
    size_t result;
    size_t inbytesleft = 8;
    size_t outbytesleft = 20;
    int i;

    cd = iconv_open("GB2312", "UTF-16BE");
    dataptr = data;
    outdataptr = outdata;
    result = iconv(cd, &dataptr, &inbytesleft, &outdataptr, &outbytesleft);
    if(result == -1)
        printf("Error: %d\n", errno);
    printf("      result: %zd\n", result);
    printf(" inbytesleft: %zd\n", inbytesleft);
    printf("outbytesleft: %zd\n", outbytesleft);

    for(i = 20; i > outbytesleft; i--){
        if(i != 20)
            printf(",");
        printf("0x%02x", *((unsigned char *)&(outdata[20-i])));
    }
    printf("\n");

    return 0;
}

Он печатает

      result: 0
 inbytesleft: 0
outbytesleft: 12
0xb1,0xa3,0xb5,0xa5,0xd1,0xe9,0xd6,0xa4

Что кажется правильным.

Массив элементов в переменных данных представляет собой кодировку UTF-16BE, равную 保单验证

Если это не поможет, не могли бы вы опубликовать свой код для анализа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...