K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>いつもありがとうございます。お返事が大変遅くなりましてすみません。 > >>日本語関係は、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 の各関数は除く)。 > >このせい? (全然わかってませんが)
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!