- ベストアンサー
ワイド文字についてのURLをPlzです
ワイド文字やUnicodeの文字について詳しいサイトあったら教えてください。 レベル的には #include <stdio.h> #include <wchar.h> int main(){ wchar_t *wc = L"wchar_tワイド文字列でえす。"; fputws(wc, stdout); return 0; } これを実行して、なんで日本語が表示されないのかがさっぱりわからないレベルです。。 お願いします。 (注:教えていただきたいのは、上のプログラムの間違っている箇所でなく、それがわかるようになるようなサイトです。)
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ずっと前に私も基本的な事が知りたくて調べた事があります。その時に見付かった(非常に良かった^^)ページの URL を参考に載せておきます。 ちなみに、ご質問中のコードの場合、 + L"~" の文字列は何に(UTF16等)エンコーディングされたのかな? + このプログラムを実行した際の端末のコーディングシステムは? ってところが気になりました。 # ところで、L"~" ってなんでしょうか? # ms の .net 拡張の S"~" みたいに、また独自の拡張なんでしょうか?
その他の回答 (4)
- jacta
- ベストアンサー率26% (845/3158)
#2です。連続ですみません。 > URLにはページがないようですが・・。 失礼しました。直リンクできないようです。 http://www.jisc.go.jp/ から「JIS検索」で X3010 を検索してみてください。C++の場合は X3014 で検索できます。 > 正規表現?を現在の適当なものに変更するというかんじですか。 正規表現は関係ありません。 setlocaleおよびロケールについて調べてみてください。
お礼
検索したらすごい細かい字で文章がでてきました。 それが、文字に関係するものなのかどうかもわからないので、まずはwohankeleさんの紹介してくださったサイトを見て勉強して、知識をつけてから見てみます。 何度もありがとうございました。
- jacta
- ベストアンサー率26% (845/3158)
#2です。 ワイド文字について少し補足します。 C/C++におけるワイド文字はwchar_t型で表される文字のことですが、wchar_t型はchar型と同じ範囲しか表現できない場合もあれば、32ビットの範囲で表現できる場合もあります。また、ワイド文字の内部表現も、UnicodeやISO 10646の場合もあれば、シフトJISやEUCなどの場合もありえます。 ソース文字集合をもとに、コンパイル時にどんな実行文字集合に変換されるかは処理系に依存します。また、プログラム内部で使用する文字コードから外部に出力すべき文字コードへの変換ルールはロケールに依存します(そしてロケールの実装は処理系に依存します)。 というわけで、このあたりを正しく理解するためには、まず規格書を読んで理解する必要があるわけです。 ところで、ワイド文字定数は L'文字'、ワイド文字列定数は L"文字列" といった表記をします。前に付く L はマクロではなく、ワイド文字を表す接頭辞です。
お礼
wohaokeleさんの紹介してくださったサイトを見ると、ISO 10646は、イコールでUnicodeのことのようですね。 ロケールがからむとまた難しいですね。 今までそんなこと気にしてませんでしたから。
- jacta
- ベストアンサー率26% (845/3158)
> (注:教えていただきたいのは、上のプログラムの間違っている箇所でなく、それがわかるようになるようなサイトです。) 処理系に依存する部分ですので、使われている処理系のマニュアルとC言語の規格を見てください。(C言語の規格は下記URL参照) ちなみに、fputwsを呼び出す前に setlocale(LC_CTYPE, ""); を入れると直る可能性があります。 ただし、OSが日本語環境でなかったり、GCC等を使用している場合は無理です。
お礼
URLにはページがないようですが・・。 確かに、setlocale(LC_CTYPE, ""); とすると、日本語も表示されました。 正規表現?を現在の適当なものに変更するというかんじですか。 ということは、setlocale関数は、この使用法さえわかっていれば、たいていのことには事足りるのかな。。 ともあれ、今のところ問題な部分は打開できたので、おふた方、ありがとうございました。 もしかすると存在する、隠れた名サイトを紹介してもらえる可能性があるので、締め切りはもうちょっと待とうかなと思います。
- nitscape
- ベストアンサー率30% (275/909)
>教えていただきたいのは、上のプログラムの間違っている箇所でなく。。 このように考えるのは非常にいいと思います。しかし現実問題として残念ながら包括的にユニコードについて解説しているサイトはまだないです。Googleで少しずつ調べていくしかないのが現状です。 まずユニコードというのは普段使っている文字ではありません。これはちょっとウソっぽい表現ですが。。。普段C言語では文字列の長さを知るのにstrlenを使ったりしますよね。この手のstrlenやstrcpyなどの関数は使うことができません。そのためwcscpyのようなワイド文字に対応した関数を使うことになります。 また普通はcharが1文字(もしくは漢字の場合はchar[2]で1文字)になりますが、ユニコードの場合はwchar_t(WCHAR)で1文字になります。 またC言語(VCのみ?)では_T、_TEXT、Lといったマクロがよく使われます。このうち_Tと_TEXTはビルド方法(UnicodeビルドかMBCSビルドか)によって意味が変わります。 。。。。このくらいをしっかり押さえておくとユニコードのプログラミングもできるようになります。キーワード的には ユニコード ワイド文字 wcscpy _Tマクロ(_TEXTマクロ) Lマクロ Unicodeビルド MBCS wchar_t WCHAR という感じでしょうか?これらのキーワードを1つずつ調べて理解していくといいと思います。
お礼
学校や会社で学んでいる方は、そんな苦労しなくてもいいんでしょうかね・・。 TマクロやTEXTマクロ、Lマクロなんかは、"マクロ"をつけて検索しているのに、全然関係ないものがでてきますね・・。 Unicode関係は、MFC関係のものばかりですし。。(MFCは使ったことがないので。) 頭がいたいですが・・暇があったら少しずつ調べてデフラグしていこうと思います。
お礼
URLありがとうございます。 非常に奥が深いというか、覚えることが山ほどありますね。 質問については、jactaさんがNo.4で答えているようなことでいいと思います。(というかそのほうが確実な答えだと思います) 紹介してもらったリンクサイトは読もうとするとかなり時間がかかりそうなので、暇があればちまちま読んでいこうと思います。