linux - 为什么 iconv 读取的字节数比我指定的多

标签 linux unicode

我用

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

将 UTF-16BE 转换为 GB2312。

inbytesleft 是要转换的字节数。转换后,inbytesleft为未转换的字节数。

在一次调用后,我发现根据 iconv man page inbytesleft 为 -2此函数最多应读取 inbytesleft。 谁能告诉我为什么以及如何解决这个问题?

要转换的代码是

"保单验证"

谢谢

最佳答案

如何将输入数据输入到程序中?

我已经使用此代码测试了情况,它似乎有效:

#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编码

如果这没有帮助,您可以发布您的代码进行分析吗?

关于linux - 为什么 iconv 读取的字节数比我指定的多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6199305/

相关文章:

linux - 如何在shell脚本中使用基于变量的if语句

python - centos 7 上的 Python 3.6 中缺少 turtle 图形模块?

c++ - GetUserNameEx() 返回的缓冲区大小

python - 使用西类牙语或波兰语字符对字符串进行编码/转换

go - 解码 : golang 时跳过解码 Unicode 字符串

linux - cURL 文件上传 - "No File Provided"

linux - tsv 文件两列的并集

android - 如何在Android中编写后台服务?

python - 是否有特定范围的 unicode 代码点可以检查表情符号?

java - 使用 UnicodeBlock 打印国际象棋符号?