ワイド文字列表示で表示が「?」になる原因は何でしょうか?

このQ&Aのポイント
  • ワイド文字(列)について質問です。printf()などより、wprintf()などのワイド文字を扱える関数を使おうと思っているのですが、うまく表示されません。何が原因なのでしょうか?
  • wprintf(L"%s\n", data);は表示はされるのですが、「?」になります。
  • 環境はXPとVisual Studio 2005です。
回答を見る
  • ベストアンサー

ワイド文字(列)について

ワイド文字(列)について質問です。 printf()などより、wprintf()などのワイド文字を扱える関数を 使おうと思っているのですが、うまく表示されません。 何が原因なのでしょうか? ソースです。 #include <stdio.h> int main(void) { wchar_t *data = L"かきくけこ"; wprintf(L"あいうえお\n"); wprintf(L"%s\n", data); return (0); } wprintf(L"%s\n", data);は表示はされるのですが、 「?」になります。 環境 XP Visual Studio 2005

noname#154655
noname#154655

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

単にロケールの設定が足りないだけでしょう。 #include <locale.h> setlocale(LC_ALL, "japanese"); MSDN setlocale http://msdn.microsoft.com/ja-jp/library/x99tb11d%28VS.80%29.aspx

noname#154655
質問者

お礼

出来ました。 ありがとうございます。 setlocale()が必要なんですね。 調べてもsetlocale()が必要とは書いてなかったので、 助かりました。 1つ疑問があるのですが、 setlocale(LC_ALL, "japanese");の"japanese"なのですが、 japaneseという事は日本語のみになるのではないでしょうか? 他の言語(中国語など)も扱う場合などはどうすればいいのでしょうか?

その他の回答 (3)

回答No.4

>ただ、フォントの関係で表示できるかはわかりません。 ではないですね。 リンク先に >オペレーティング システムがサポートしていない言語は setlocale で使用できません。 って書いてありましたね。

noname#154655
質問者

お礼

色々調べてみたのですが、 setlocale(LC_CTYPE, ""); で出来るということなのでやってみたらできました(たぶん)。 「Japanese_Japan.932」が返ってきたのでこれでいいと思います。 他の言語では試せないので分かりませんが。 http://www.bugbearr.jp/?%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%2FAPI http://d.hatena.ne.jp/s-kita/20080712/1215827470 ありがとうございました。

回答No.3

リンク先をたどればいけそうなんだけど。 http://msdn.microsoft.com/ja-jp/library/39cwe7zf%28VS.80%29.aspx ただ、フォントの関係で表示できるかはわかりません。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ひょっとして L"%ls\n" としたかった?

noname#154655
質問者

お礼

回答ありがとうございます。 "%ls"で再度試してみたのですが出来ませんでした。

関連するQ&A

  • ワイド文字についてのURLをPlzです

    ワイド文字やUnicodeの文字について詳しいサイトあったら教えてください。 レベル的には #include <stdio.h> #include <wchar.h> int main(){ wchar_t *wc = L"wchar_tワイド文字列でえす。"; fputws(wc, stdout); return 0; } これを実行して、なんで日本語が表示されないのかがさっぱりわからないレベルです。。 お願いします。 (注:教えていただきたいのは、上のプログラムの間違っている箇所でなく、それがわかるようになるようなサイトです。)

  • ワイド文字をプロンプトに表示できません。

    #include <wchar.h> #include <tchar.h> #include <wtypes.h> #include <stdio.h> int main() { wchar_t str[] = OLESTR("まいうえお"); _putws( str ); printf("strlen = %d\n", wcslen(str) ); return 0; } プロンプト上で実行しても、何も表示されないまま終了してしまいます。 「str」の文字数は5となっているので、_putws関数が動作していないのでしょうか。

  • 文字列から数

    #include<stdio.h> int main (void){ char st[100]; printf("数字列を入力してください。"); scanf("%s",st); printf("%f %d %ld\n",atof(st),atoi(st),atol(st) ); return(0); } コマンドプロンプトから123.45と入力すると、 0.000000 123 2686588と表示されます。 %fのあたりが間違っているのでしょうか、123.45 123 123と表示されるように 御指摘お願いします。

  • 文字列

    下のプログラムは何をするためのプログラムなのか教えてください。 個人的にはJISコードに関係していると思うのですがさっぱりわかりません。 どなたか詳しい説明お願いします。 #include <stdio.h> #define LEN 255 int main(void) { char str[LEN]; char cipher[LEN]; int ikey; int i,n; printf("文字列を入力せよ : "); scanf("%s", str); printf("鍵を入力 : "); scanf("%d", &ikey); i = 0; while (str[i]!='\0') { n = (str[i]-'A'+ikey)%26; cipher[i] = 'A'+n; ++i; } cipher[i] = '\0'; printf("%s\n", cipher); return 0; }

  • 文字列を大文字にするプログラムがわかりません。

    小文字を大文字に、大文字はそのまま、それ以外は表示しないプログラムなんですが、 「それ以外を表示しない」というところが書けません。 #include <stdio.h> int main(void) { char x; char *p; puts("文字列を入力"); scanf("%s", &n); for(p = &n; *p != '\0'; p++){ if(*p >= 'a' && *p <= 'z'){ *p = *p - 'a' + 'A'; } } printf("%s\n", &n); return 0; } これではもちろん数字などはそのまま表示されてしまいます。 しかも、4文字までは普通に大文字で表示されるんですが 6文字だとcoredumpedしてしまいます。 すいませんが、ソース書いて教えていただけると嬉しいです。

  • C言語で、ワイド文字の表示がうまくいきません。

    C言語を初めてかなり長い年月が経っておりますが、 「ファイルから読み込んだワイド文字を表示できない」という 初歩的な問題に悩んでおります。 以下にソースを載せてありますので、誤りを教えて頂けると 大変嬉しいです。 処理内容は、 (1) Test.txt へ文字"ABC"を出力 (2) Test.txtから文字列を読み込み表示 です。 ============================================ #include <stdio.h> #include <locale.h> void main() { FILE *pFileOut = NULL; FILE *pFileIn = NULL; ::_wsetlocale(LC_ALL, L""); if(::_wfopen_s(&pFileOut, L"Test.txt", L"w,ccs=UTF-16LE") == 0) { ::fwprintf(pFileOut, L"%s", L"ABC"); ::fclose(pFileOut); } if(::_wfopen_s(&pFileIn, L"Test.txt", L"r") == 0) { unsigned char cBOM[2]; wchar_t szString[100]; cBOM[0] = ::fgetc(pFileIn); cBOM[1] = ::fgetc(pFileIn); printf("%02x%02x\n", cBOM[0], cBOM[1]); ::fwscanf(pFileIn, L"%s", szString); ::wprintf(L"[%s]\n", szString); ::fclose(pFileIn); } } ============================================ ちなみに、作成されたファイルのバイナリは以下の通りになっております。 ff fe 41 00 42 00 43 00 また、実行結果は以下の通りになっております。 fffe [A] 以上よろしくお願い致します。

  • 文字列を入力・表示

    文字列を入力して表示したいのですができません。誤っていないと思うのですが・・・。何が間違っているのでしょうか? #include<stdio.h> void main (void) { char namae; printf("お名前を登録します。お名前を入力して下さい。\n"); scanf("%s",&namae); printf("お名前は%sですね。\n",namae); }

  • 文字列の読み込みについて教えてください!

    c言語の文字列で キーボードで名前を入力して名前が"oh"なら"世界の王"、"nagashima"なら"ミスター長嶋"と表示し、 それ以外の名前なら"さん"をつけて表示するプログラムを作成するんですが… #include <stdio.h> int main(void) { char name[20]; printf("お名前は?\n"); scanf("%s", name); printf('%sさん\n', name): return (0); } で お名前は? name nameさん とは出来るんですが、"世界の王"、"ミスター長嶋"の表示方法がわかりません。 出来ればソース書いてくれるとありがたいんですが、 ヒントだけでもお願いします! if else とか使うと思うんですが、うまくいきません。

  • 配列やポインタに文字列を設定することについて

    ◎1------------------------- #include<stdio.h> int main(void) { char ss[80]; scanf("%s",ss); printf("%s\n",ss); return 0; } ---------------------------- ◎2--------------------------- #include<stdio.h> int main(void) { char *ss="abcde"; printf("%s\n",ss); return 0; } ------------------------- ◎3---------------------- #include<stdio.h> int main(void) { char *ss; ss="abcde"; printf("%s\n",ss); return 0; } ------------------------- 以上3つプログラムで疑問をいだいたのですが、 まず◎1で、これは例えば、 cahr ss[80]="abc"; のように配列ssに文字列"abc"そのものを入れているのか、 char *ss="xyz"; のようにまず"xyz"という文字列をメモリ上のどこかに設定し、その先頭番地をssに代入しているのか、どちらの考えでいいのかわかりません。 次に、◎2、3ではどちらも正常に実行できたのですが、特に◎3で「ss="abcde";」と記述していますが、ssにはアドレスを代入するという認識かあるのですが、文字列定数を代入しても問題ないのか?という疑問があります。 教えていただけたら嬉しいです。

  • 小文字のみを数える方法

    小文字のみを表示させるプログラミングがいくらやってもできません。範囲指定をどこですれば良いのかわからず、全部の文字数をカウントしてしまいます。 ご指摘お願いします。 #include <stdio.h> #include <string.h> int main(void) { char str[256]; int a; printf("大文字と小文字をランダムに入力\n"); gets(str); printf("小文字の数は%dです\n",strlen(str),a); return(0); }

専門家に質問してみよう