いつもありがとうございます。お返事が大変遅くなりましてすみません。
>日本語関係は、ISO-C の mbr/wcs 系関数 (1バイトずつ処理するなら
>mbrtowc(3)) を使うのはどうですか?
>想像だけど、これで Windows なら wchar_t は Unicode になるん
>じゃないでしょうか。
やってみました。WindowsXP + MinGWです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>
int
SJIStoUCS16(const char *src, wchar_t *dest)
{
int src_idx, dest_idx;
int status;
mbstate_t ps;
memset(&ps, 0, sizeof(mbstate_t));
for (src_idx = dest_idx = 0; src[src_idx] != '\0'; ) {
status = mbrtowc(&dest[dest_idx], &src[src_idx], 2, &ps);
dest_idx++;
src_idx += status;
}
return dest_idx;
}
int
main(int argc, char **argv)
{
const char *src = "abcあいうえお憂鬱";
wchar_t dest[1024];
int size;
int i;
setlocale(LC_CTYPE, "");
for (i = 0; src[i] != '\0'; i++) {
printf("[%02x]", ((unsigned char*)src)[i]);
}
putchar('\n');
size = SJIStoUCS16(src, dest);
for (i = 0; i < size; i++) {
printf("[%04x]", dest[i]);
}
putchar('\n');
return 0;
}
C:\>gcc sjtoucs16.c -o sjtoucs16 -lmsvcp60
C:\>sjtoucs16
[61][62][63][82][a0][82][a2][82][a4][82][a6][82][a8][97][4a][9f][54]
[0061][0062][0063][3042][3044][3046][3048][304a][6182][9b31]
UNICODE(UCS-2)に変換できたようです。
コンパイルオプションに-lmsvcp60がないと、mbrtowc()はリンクできません。
しかし、mbtowc()では不要です。よくわかりません。
また、mbsrtowcs()は、いろいろ試しましたが動いてくれませんでした。
setlocale(LC_CTYPE, "")とすると-1を返しますし、setlocale()しなければ
動きますが、戻ってくるのは、元のS-JISをwchar_tに1バイトずつ入れただけのものです。
それをwprint()すると、ちゃんと表示されるのですが。こっちもよくわかりません
(Linuxでは動く)。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_setlocale.2c_._wsetlocale.asp
| LC_CTYPE
| 文字処理関数 (isdigit、isxdigit、mbstowcs、mbtowc の各関数は除く)。
このせい? (全然わかってませんが)