Subject: iconv_open() / UCS-2-INTERNAL question
To: None <email@example.com>
From: Chuck Cranor <firstname.lastname@example.org>
Date: 01/28/2007 22:12:53
i updated my version of gphoto2 to libgphoto2-2.3.1 and the
PTP2 driver stopped working due to iconv_open() failing.
if you look at:
you will see that they are doing code that basically boils
down to calling iconv_open(3) with "UCS-2-INTERNAL" ... but we
don't appear to have a "UCS-2-INTERNAL" so clearly the new gphoto 2.3.1
code is wrong. What should they be doing here? they appear to
be trying to address some sort of endian problem (see comment I copied
from them in the test code below).
the test program below is based on their gphoto2 code (with
all the extra stuff thrown out). it fails with:
iconv_open A: Invalid argument
iconv_open B: Invalid argument
* On MacOS (Darwin) and *BSD we're not using glibc, but libiconv.
* glibc knows that UCS-2 is to be in the local machine endianness,
* whereas libiconv does not. So we construct this macro to get
* things right. Reportedly, glibc 2.1.3 has a bug so that UCS-2
* is always bigendian though, we would need to work around that
#define UCS_2_INTERNAL "UCS-2-INTERNAL"
#if (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1 )
#error "Too old glibc. This versions iconv() implementation cannot be trusted."
#define UCS_2_INTERNAL "UCS-2"
iconv_t a, b;
curloc = nl_langinfo (CODESET);
printf("curloc=%s, UCS_2_INTERNAL=%s\n", curloc, UCS_2_INTERNAL);
a = iconv_open(curloc, UCS_2_INTERNAL);
if (a == (iconv_t)-1) perror("iconv_open A");
b = iconv_open(UCS_2_INTERNAL, curloc);
if (b == (iconv_t)-1) perror("iconv_open B");