Linuxプログラムに読み込みたいUNICODE-16文字列を含むファイルがあります。文字列は、Windowsの内部WCHAR形式から生で書き込まれました。(Windowsは常にUTF-16を使用しますか?たとえば、日本語版)
生の読み取りとwcstombs_lによる変換を使用してそれらを読み取ることができると思います。ただし、使用するロケールがわかりません。最新のUbuntuおよびMacOSXマシンで「locale-a」を実行すると、名前にutf-16が含まれるロケールはゼロになります。
もっと良い方法はありますか?
更新:正解と以下の他のものは、私がlibiconvを使用することを指摘するのに役立ちました。これが私が変換を行うために使用している関数です。私は現在、1行のコードに変換するクラス内にそれを持っています。
// Function for converting wchar_t* to char*. (Really: UTF-16LE --> UTF-8)
// It will allocate the space needed for dest. The caller is
// responsible for freeing the memory.
static int iwcstombs_alloc(char **dest, const wchar_t *src)
{
iconv_t cd;
const char from[] = "UTF-16LE";
const char to[] = "UTF-8";
cd = iconv_open(to, from);
if (cd == (iconv_t)-1)
{
printf("iconv_open(\"%s\", \"%s\") failed: %s\n",
to, from, strerror(errno));
return(-1);
}
// How much space do we need?
// Guess that we need the same amount of space as used by src.
// TODO: There should be a while loop around this whole process
// that detects insufficient memory space and reallocates
// more space.
int len = sizeof(wchar_t) * (wcslen(src) + 1);
//printf("len = %d\n", len);
// Allocate space
int destLen = len * sizeof(char);
*dest = (char *)malloc(destLen);
if (*dest == NULL)
{
iconv_close(cd);
return -1;
}
// Convert
size_t inBufBytesLeft = len;
char *inBuf = (char *)src;
size_t outBufBytesLeft = destLen;
char *outBuf = (char *)*dest;
int rc = iconv(cd,
&inBuf,
&inBufBytesLeft,
&outBuf,
&outBufBytesLeft);
if (rc == -1)
{
printf("iconv() failed: %s\n", strerror(errno));
iconv_close(cd);
free(*dest);
*dest = NULL;
return -1;
}
iconv_close(cd);
return 0;
} // iwcstombs_alloc()