ワイド文字とマルチバイト文字

VisualStudio2005からビルド時に使用する文字コードが変更になりました。

今まではマルチバイト文字セット、わかりやすく言うとShiftJISコードでした。

しかし、世界中のWindowsに対応させるためにMicrosoft社は、世界標準であるワイド文字セットつまりUnicode、もっとわかりやすく言うとUTF-16コードに切り替えたのです。

こんなところにまでグローバル化の波が来たわけですね。

文字コードの違い

マルチバイト文字セットでビルドするのと、ユニコード文字セットでビルドするのはいったい何が違うのでしょうか?

マルチバイト文字セットとは通称シフトジスコードのことで、現在の日本語Windowsの表部分で使われていたりします。

半角文字を1バイト、全角文字を2バイトで表現します。

マルチバイト文字セットは1文字が何バイトかを文字ごとに計算しなくてはならない面倒さはあるものの、半角文字の多い文章では情報量を削減できるというメリットがあります。

一方Unicodeとは、世界標準の文字コードとして設計された文字セットのことで、Windowsの内部でも使われています。

Windowsの内部では、日本語や英語などといった言語文字の種別にかかわらず、すべて1字2バイトで表現されます。

ワイド文字セットは、1字が必ず2バイトのため「文字数=バイト数÷2」という関係が成り立ちます。

厳密に言うと、Unicodeはサロゲートペアによって4バイトで表現される拡張文字もあるので、絶対とはいえませんが通常は意識しないのでここでは無視します。

プログラム上での違い

互いの文字コードは、プログラム上でそれぞれ文字領域の定義があります。

具体的には、マルチバイト文字セットは1バイト単位のchar型。

これに対して、ワイド文字セットは2バイト単位のwchar_t型となっています。

そうなるとプログラムを書く上で困ることは、マルチバイト文字セット用の文字列操作関数と、ワイド文字セット用の文字列操作関数が異なってくることですね。

解決方法

今まではプログラム時の文字コードはすべてShiftJISで考え、マルチバイト文字セットを相手に文字列操作を行ってきました。

しかし、これからはワイド文字セットのことも考えなくてはいけないとなると大変ですよね。

そこで、VisualStudioではTCHAR型という文字型が新たに定義されました。

TCHAR型はtypedef定義であり、ビルド時の設定によりマルチバイト文字セットの場合はchar型に、ワイド文字セットの場合はwchar_t型にそれぞれ振る舞いを変えてくれる便利な型です。

あとは、プログラマー側でビルド時の設定を切り替えるだけです。

文字セットの設定方法

ビルド時のデフォルトがワイド文字セットのVisualStudio2005において、マルチバイト文字セットに変更する方法を記述します。

しかし、画面が見えている人と見えていない人では操作方法が異なってくるので両方記述しておきます。

画面が見えている人向け

まずは、VisualStudio2005用プロジェクトファイルを開きます。

プロジェクトフォルダの中にある拡張子がslnと書かれているファイルがそうです。

ソリューションエクスプローラのTreeからプロジェクト名を右クリックし、ポップアップメニューから「プロパティ(R)」を選択します。

プロパティウィンドウが出たら、構成プロパティの全般タブをクリックします。

出てきた設定項目の中から「文字セット」を探してクリックします。

すると、下矢印が表示されプルダウンメニューが表示されるので、その中から自分の設定したい文字セットを選択してからOKボタンを押します。

このとき設定項目と内容の関係は下記のようになります。

設定なし
_UNICODE _MBCS いずれも設定しません。
シングルバイト文字列設定になると思います。
日本語を意識せず、英語アスキーコードしかないと考えます。
Unicode 文字セットを使用する
_UNICODEオプションを設定し、TCHARはwchar_tへ自動変換されます。
文字操作関数もすべてワイド文字列対応のものへ自動読み替えされます。
マルチ バイト文字セットを使用する
_MBCSオプションを設定し、TCHARはcharへ自動変換されます。
文字操作関数はマルチバイト文字列対応のものへ自動読み替えされます。
画面が見えていない人向け

まずは、VisualStudio2005用プロジェクトファイルを開きます。

プロジェクトフォルダの中にある拡張子がslnと書かれているファイルがそうです。

プロジェクトファイルをVisualStudioのVisualC++で開いたら、まずはソリューションエクスプローラにスクリーンリーダーのフォーカスを移動させます。

ソリューションエクスプローラには、プロジェクトに登録されているファイルの一覧が種類別にTreeView形式で表示されています。

何もないWin32プロジェクトの場合には、ソースとヘッダーとリソース用のフォルダがあるのみです。

ソリューションエクスプローラへのフォーカス移動には、VisualC++側で用意されているショートカットキーを使います。

CtrlとAltキーを押しながらLキーを押すとソリューションエクスプローラに移動できます。

もっと正確に言うと、ソリューションエクスプローラ内のプロジェクト名のフォルダ位置にフォーカスが着ます。

これは前述しましたソース、ヘッダーやリソース用のフォルダのひとつ上の階層に当たるものです。

ちなみに、現在フォーカスされているプロジェクト名のフォルダのひとつ上の階層には、複数のプロジェクトを束ねる大本の階層があります。

矢印キーを押せば簡単に移動できますが、今回はその必要はないので移動しないでください。

現在位置であるプロジェクト名のフォルダにカーソルがある状態で、アプリケーションキーを押します。

メニューが出てきたら「プロパティ(R)」を選択します。

すると、プロパティウィンドウが表示されるんですが、スクリーンリーダーユーザーはここで注意する必要があります。

実はこのプロパティウィンドウというのが、選択項目によって同じウィンドウ内で内容がコロコロ変わります。

なので、矢印キーで一項目ずつ移動させていると実際の設定部分の内容も知らないうちに変化してしまい、だんだんスクリーンリーダーがついていけなくなってしまいます。

そうなると、内容が切り替わった後でも前の内容を読み上げてしまったり、EditやListViewなどのコントロールのガイド音声も間違ったものになってしまう場合もあります。

そんなわけで、全盲のスクリーンリーダーユーザーは特に注意してプロパティウィンドウを操作するようにしてください。

キー操作はなるべくゆっくり行ってください。

もし性能の低いパソコンを使っている場合、すばやく押してしまうとスクリーンリーダーが落ちてしまう可能性があります。

それでは実際にプロパティウィンドウを操作して文字コードを変更してみましょう。

プロパティウィンドウ起動時の最初のフォーカス位置は、「全般」の中の「出力ディレクトリ」という項目になっているはずです。

そこから4回ほど上矢印キーをゆっくり押します。

すると「文字セット」という項目があります。

初期設定では「ユニコード文字セットを使用する」になっているはずです。

スクリーンリーダーによっては、設定項目と設定値を一度に読み上げる場合があります。

その場合は、「文字セット、ユニコード文字セットを使用する」みたいに読み上げるはずです。

これはVisualC++ビルド時にUTF-16コードで処理するという意味です。

そうではなくShiftJisコードで処理させたいので、使用する文字コードを切り替えます。

Altキーを押しながら下矢印キーを押すと、リストボックスが開くので、そこから「マルチバイト文字セットを使用する」を選択しEnterキーを押します。

マルチバイト文字セットとはShiftJisコードの文字セットという意味です。

おそらくShiftJisコードが文字を表現する際、1バイト文字と2バイト文字が混在しているところからこのような呼び名にしたのでしょうね。

とにかくこれで、VisualC++ビルド時にShiftJisコードが使われるようになりました。

スクリーンリーダーによっては、「文字コード、マルチバイト文字セットを使用する」と読み上げるはずです。

TABキーを何回か押して、OKボタンまで移動しスペースキーまたはEnterキーを押せば設定完了です。