#include #include #include #include #include int main(void) { // const char *src_encoding = "iso-8859-1"; // const char *dst_encoding = "UTF-8"; // const char *src = "hallö"; const char *src_encoding = "CP1255"; const char *dst_encoding = "UTF-8"; const char *src = "\xF9._\xF9\xF4\xF8\xE4"; iconv_t cd; int ret = 1; cd = iconv_open(dst_encoding, src_encoding); if (cd != (iconv_t)-1) { char *tmp = (char *) src; // iconv won't change where src points to, but changes tmp itself size_t tmp_len = strlen(src); size_t dst_len = tmp_len * 6, dst_len_tmp = dst_len; char *dst = malloc(dst_len + 1), *dst_tmp = dst; if (iconv(cd, &tmp, &tmp_len, &dst_tmp, &dst_len_tmp) != (size_t)-1) { printf("inbytesleft=%zd outbytesleft=%zd\n", tmp_len, dst_len_tmp); printf("converted '%s' (%s) -> '%.*s' (%s)\n", src, src_encoding, (int) (dst_len - dst_len_tmp), dst, dst_encoding); /* kick out a possible 'shift sequence', else we may lose a last character stuck in cd */ if (iconv(cd, NULL, NULL, &dst_tmp, &dst_len_tmp) != (size_t)-1) { printf("inbytesleft=%zd outbytesleft=%zd\n", tmp_len, dst_len_tmp); printf("converted '%s' (%s) -> '%.*s' (%s)\n", src, src_encoding, (int) (dst_len - dst_len_tmp), dst, dst_encoding); } ret = 0; } else fprintf(stderr, "Failed to convert '%s' string into '%s' (%d)\n", src_encoding, dst_encoding, errno); free(dst); iconv_close(cd); } else fprintf(stderr, "Failed to prepare encoding '%s' into '%s' (%d)\n", src_encoding, dst_encoding, errno); return ret; }