使用iconv在C / C ++中将字符串转换为ISO-8859-1

mai*_*ixl 3 c c++ iso-8859-1 iconv

我想将字符串从GBK字符集转换为ISO-8859-1。

我尝试使用iconv库,但iconv()始终返回-1,并errno解码为“无效或不完整的多字节或宽字符”

我该如何实现?

caf*_*caf 6

如果您打开的转换描述符不带//TRANSLIT//IGNORE,则iconv()当输入字符无法在目标字符集中表示时,将返回错误。由于ISO-8859-1无法代表大多数GBK字符,因此这很可能正在发生。以下示例对我有用:

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

int main()
{
    char *gbk_str = "GBK \xB5\xE7\xCA\xD3\xBB\xFA";
    char dest_str[100];
    char *out = dest_str;
    size_t inbytes = strlen(gbk_str);
    size_t outbytes = sizeof dest_str;
    iconv_t conv = iconv_open("ISO-8859-1//TRANSLIT", "GBK");

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

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

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(我希望GBK字符串不要淫秽,我不知道这是什么意思!)