Visual Studio2010で文字コードを選ぶ際の疑問

このQ&Aのポイント
  • Visual Studio2010を使用している際に文字セットの選択肢がマルチバイト文字セットとUnicode文字セットの二つありますが、Unicode文字セットを選ぶとutf-16の文字コードになるのでしょうか?utf-8ではなくutf-16を使用しているのはなぜでしょうか?
  • Visual Studioで扱うUnicodeはワイド文字であり、utf-16は2バイト単位だけでなく、4バイト単位で1文字を表すこともあると混乱しています。また、wchar_tを使って2個分で1文字を表現する際の使い方についても知りたいです。
  • Visual Studio2010で文字コードを選ぶ際にワイド文字とutf-16の関係性について理解したいです。また、wchar_tを使用して2個分で1文字を表現する際にどのように使うのかについても教えてください。
回答を見る
  • ベストアンサー

visual studio2010 文字コード

visual studio2010を使っています。Cのプログラムを書いてます。 文字セットを選ぶ箇所で ・マルチバイト文字セットを使用する ・Unicode文字セットを使用する という2つの選択肢がありますが、 上を選ぶとshift-jisの文字コードが選ばれると認識してます。 それで、下のUnicode文字セットを使用するを選んだ場合なんですが、 これはutf-16のことですか? utf-8が主流だと思っていたのでここでさすUnicodeが勝手に utf-8のことだと思ってたんですが、 visual studioで扱っている方はワイド文字で、 utf-8について調べたらASCIIにも対応できる可変長のマルチバイト という風に書いてあったので、あれ?と思い色々調べたら ウィンドウズではメモ帳などでUnicodeという表記でutf-16を指すみたいなので これも同じでutf-16なのかなと思いました。 ただ、visual studioで扱うUnicodeはワイド文字ということと、 utf-16は2バイト固定ではなく2バイト単位なだけで 4バイトで1文字を表すこともあることが書いてあったので、 これはワイド文字とは違う??と混乱してます。 それともワイド文字は2バイト固定と思ってたんですが wchar_tが2バイトずつなだけでワイド文字は1文字2バイトというわけではない ということでしょうか? それとwchar_tで2個分で1文字を表したりする使い方はするんでしょうか? まとまりのない質問になってしまいましたがよろしくおねがいします。

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

>それで、下のUnicode文字セットを使用するを選んだ場合なんですが、 >これはutf-16のことですか? そうです。 >それともワイド文字は2バイト固定と思ってたんですがwchar_tが2バイトずつなだけでワイド文字は1文字2バイトというわけではないということでしょうか? >それとwchar_tで2個分で1文字を表したりする使い方はするんでしょうか? wchar_tは2オクテットとは限りません。 またwchar_tの内部表現がutf-16かどうかも定義されていません(Windowsだと2オクテットでutf-16ってだけ)。 >それとwchar_tで2個分で1文字を表したりする使い方はするんでしょうか? これについてはおそらくサロゲートペアの事をいわれてるのだと思います。

luna3x
質問者

お礼

回答ありがとうございます。 曖昧だった部分がわかりました。

関連するQ&A

  • UNICODE対応ってどういうことなのかわかりません

    VC++とかでUNICODE対応というと文字列をwchar_t型で扱うことなのかなと思うのですが、その場合UTF-8ってどういう扱いになっているのでしょうか? ウィキペディアを見ると、インターネットではUTF-8が主流であるようなことが書かれています。 UTF-8はアスキー文字セットとも互換性があるようなので、char型で文字列を扱うのかなと思いました。 それなのに、VC++でUNICODE対応の設定にするとwchar_tで文字列を扱うようなので、UTF-8がどういう扱いになっているのかよくがわからないのです。 どなたかお答え頂けないでしょうか。 よろしくお願いします。

  • 定義した文字列を wchar_t 系の関数へ

    こんにちは。 VisualStudioでマルチバイト文字セットを使用する設定のプロジェクトで、下記のように定義された文字列を wchar_t をパラメータとする関数にセットするにはどのようにすればよろしいのでしょうか? #define _FOO "foo" void funcA( const char* const szValue ) { } void funcW( const wchar_t* const szValue ) { } void test( void ) { funcA( TEXT( FOO )) ; ← ok。 funcW( TEXT( FOO )) ; ← エラー。 } UNICODE文字セットを使用する設定のプロジェクトならば問題ないのですが、マルチバイト設定ですとエラーになってしまいます。UNICODE、マルチバイト両方にプロジェクトに対応できるにはどうきじゅつすればよろしいのでしょうか。

  • 文字のバイト数を数えるには

    なんか一日一問になってしまったのですが、、 よろしくお願いします。 wchar_t 型に入っている文字のバイト数を数えるにはどうしたら良いでしょうか? L"あいう123" のような文字の場合UNICODEの場合12バイトですが、 全角半角区別して9バイトを求めたいです。 UNICODE環境では不可能でしょうか?

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

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

  • ワイド文字のバイト数が取得できず困っています。

    ワイド文字のバイト数を求めたいのですが、文字数しか取得することが出来ません。 ワイド文字のバイト数を取得する事は出来ないのでしょうか? Visual C++ 2008 Express Edhition の デバックモードで動かしています。 ****************************** wchar_t s[256]; s = L"abcあいう"; int len = wcslen(s); ******************************

  • 文字コードに関することです

    こんばんは。 社会人1年目でSEをやっております。 来週文字コードについて、発表することになっています。 発表内容として 文字コードの種類としてsjis.unicode.EUCなどがあり、これらの文字コードについて説明します。 しかし、どの程度のレベルまで説明すればいいのか悩んでいます。 私の考えとしては、unicodeを例にあげさせていただきますが、 unicodeとは、世界の言語を1文字2バイトを用いて表現できる文字コードです。unicodeの中でも大きく分けて2種類utf-8、utf-16に分けられます。 次に各utfの詳細な説明に入ります。 こんな具合にそれぞれの文字コードについて、説明していってもよろしいですか?? あと、utf-8がなぜ必要になったのか、教えていただけますでしょうか?? よろしくお願いします。

  • VC++ マルチバイト文字とUniCode文字??

    VC++のプロジェクトプロパティには文字セット指定があります 『マルチバイト文字セット』『UniCode文字セット』の2者が選択出来ますが、これらの選択の優劣は何処にありますか? この選択の適否が分からない私は参考にしているサンプルがマルチバイトである時にはマルチバイトを、またUniCodeで書かれたサンプルを見ている際にはUniCodeを指定しており、恥ずかしいかぎりです 選択の判断基準を如何すれば良いのかご指導をお願い申し上げます 更に恥ずかしい質問】なぜC#には文字セット指定が見当たらないのでしようか???

  • UTF-8とASCIIコードにおける互換性について

    UTF-8とASCIIはそのASCIIコードの範囲のおいて 互換性を持ちます。(と、書籍や多種な文献にはそういった記述があります) たとえば【A】という文字をUTF-8で符号化した際は【41】(16進数で) さらにASCIIコードでも【41】という値がAという文字に割り当てられています。 確かに、一件互換しているようにみえますが、UTF-8っていうことは最終的には Unicode上のコードポイントの値・・・つまり0x0041という値に復元?(というのでしょうか)するわけですよね? でそのUnicodeの文字集合上から復元したコードポイントに対応する文字を参照しAという文字をみつけてくると・・・。 これって【A】という文字をUTF-8で符号化した歳のバイト列はASCIIと一致しているけれど 結局Unicodeコードポイントに直した場合【00】という上位バイトが無駄にくっついてきて【0x0041】となり 互換性がなくなるのではとおもったのですが・・・。 これはどういう意味の互換性なのでしょうか? 識者の方ご教授ください。 お願い致します。

  • 自作ライブラリとプロジェクトの文字セットによる文字化けについて

    お世話になります。 今回自作ライブラリ内にある、ウインドウ作成補助関数をUnicode、マルチバイト文字両対応にするべく作業を進めていたのですが、ある所でどうしても上手く行かず、どうしたものかと困っております。 概要は下記の通りです。 1. Unicode用関数とマルチバイト用関数は分けれらており、UNICODEマクロの有無によって使用する関数を自動的にわけています。 2. 自作ライブラリをUnicode文字セットでビルドし、ライブラリを使用するプロジェクトをマルチバイト文字セットでビルドした場合、ライブラリ内ウインドウ作成クラスから関数を利用してウインドウを作成すると、どうしてもタイトルバーのタイトルに文字化けが起こってしまう。 以下に要点だけをまとめたソースを記載させていただきます。 文字数の関係で、リンクとなってしまい申し訳ありません。 http://blog-imgs-26.fc2.com/b/a/l/balmysoft/CreateWindow.txt プロジェクトでの使用法は INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow) { CCreateWindow cw; cw.SimpleCreateWindow( _T("HelloWorld"), その他いろいろ... ); // その後の処理 // } このような形です。 ライブラリとの文字セットとの違いを考慮し、関数を分けて使い分けているのですが、実際にウインドウが作成されてみると、タイトルバーのタイトルが文字化けをしてしまっています。 また、関数内でもそれぞれの文字セット用の関数を呼び出しているつもりなのですが、これだけでは至らないのでしょうか? もちろんプロジェクト側の文字セットをUnicodeにすれば大丈夫です。 また、ライブラリ側をマルチバイト文字セット、プロジェクト側をUnicodeにすると、先頭の一文字だけがタイトルバーに表示されます。 今回の場合は H  だけとなります。 これはワイド文字だからその通りの結果だと思うのですが、今回疑問に思っているのは。 WindowsAPI である CreateWindowA や CreateWindowW を使い分けても、実際はそのプロジェクトの文字設定によって影響されてしまうのか。 ということです。また、これを避ける手立てはあるのでしょうか? 長くなってしまい、大変申し訳ありません。 もしよろしければ、どなたか御教示頂けませんでしょうか。 宜しくお願い致します。

  • ワイド文字列とコンストラクタ

    ワイド文字列(UNICODE)をクラス化しようとしているのですが、 コンストラクタにconst wchar_t*型の引数を持たせて呼び出すと、 コンストラクタに渡された文字列が消えてしまい、wcslen()でサイズを求めると何故かサイズも0になっています。 class WideString { public: WideString(const wchar_t*); … }; WideString::WideString(const wchar_t* ws) { ::OutputDebugString(ws); // ←文字列が消えてる?表示されない int len = wcslen(ws); // ←これが0 } int main(void) { WideString wStr(L"文字列"); … } これは一体どういうことなのでしょうか。どなたか教えてください。