プロが教えるわが家の防犯対策術!

私は普段 Gnu 等のコンパイラを使っている物です。Visual Studioが使用する文字コードについて理解できなくて困っています。
どうか愚かな私に一筋の光明をお与えください。

タイトルに示したようにプロパティページの『文字セット』の設定を「ユニコード」から「マルチバイト文字」に、あるいは「マルチバイト文字」を「ユニコード」に変えることは何を意味しているのでしょうか。
デフォルトのVisual studuioでは、今でもソースファイルは Shift-jis です。
私は、「『文字セット』をユニコードに設定することは、プリプロセッサの中で、ソースファイルが勝手にユニコード(多分utf-16)に変換されているのではないか。」と考えています。
私の考えは誤りなのでしょうか?

A 回答 (3件)

>char


>hoge [] = ”hogehoge....”;
>[何かの型]
>wHoge [] = ”愚かな私”;
>と書くと、変数にはASCIIコード、あるいは Shift-jis が入力されることになります。
>一体、ユニコードには何時変換されるのでしょう.....

変換されない…かと思われます。
まあ、実際に試したワケでもないのですが……。

https://msdn.microsoft.com/ja-jp/library/windows …
TEXT()マクロを使っていれば適切に変換してくれますが、そうでないのならば変換はされないでしょう。
「マルチバイト文字セット」だった場合でも
wHoge [] = L”愚かな私”;
だったなら、wHoge[]に入るのはUNICODEになっているかと思われます。(ただし、型の方が入る場合でしょうけど)



VC++2010EEで実験。

#include <stdio.h>

void main(void)
{
 char szStr1[10] = "あ";
 wchar_t szStr2[10] = L"あ";
 char *pt;

 pt = (char *)&szStr1[0];
 printf("szStr1[0] = 0x%02X\n", *pt);

 pt = (char *)&szStr2[0];
 printf("szStr2[0] = 0x%02X\n", *pt);
}

を「マルチバイト文字セット」でコンパイル&実行すると、
szStr1[0] = 0xFFFFFF82
szStr2[0] = 0x42
「Unicode文字セット」でコンパイル&実行すると、
szStr1[0] = 0xFFFFFF82
szStr2[0] = 0x42

ちなみに、ソースコードはShift-JISとなっています。
L"あ"が、コンパイルの時点でUNICODEに変換されています。
"あ"はコンパイル時点でもShift-JISのまま。

TCHAR使用していないのでこうなります。
tchar.hを追加して、szStr1とszStr2をTCHARで作成すると…どちらかが型エラーになります。
    • good
    • 1
この回答へのお礼

ご助言に従い、少しテストしてみました。

char
hoge [] = "hogehoge";
wchar_t
hoge_1 [] = L"hogehoge",
wHoge [] = L"愚かな私";

で宣言した変数をデバッガで覗いてみると:

hoge: 0x686f6765686f676500 : ASCIIコード
hoge_1: 0x0068006f006700650068006f006700650000: utf-16 Big Endian BOMなし
wHoge: 0x611a304b306a79c10000: utf-16 Big Endian BOMなし

となることが解りました。特にこのデータはプロジェクト プロパティ『文字セット』の設定値に関係がないことも判明しました。

●文字コードの変換は L"..." で行われる。

ということですね。つまり TCHAR を使用している限り:

#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif

のようですので、ユニコード環境で宣言する文字列は全て wchar_t 型で宣言される。一方、マルチバイト文字環境では char 型で宣言される。

ということと理解しました。お手数をお掛けしましたがありがとうございました。

お礼日時:2017/06/20 10:20

作成するプログラムが文字(char)を取り扱う際に使用する文字コードを指定します。


Visual StudioはWindowsパソコン上で動作するので既定値はShift-JISとなっています。それだけのことです。

古い説明ですが以下が参考になるでしょう。

https://blogs.msdn.microsoft.com/japan_platform_ …
    • good
    • 0
この回答へのお礼

ご連絡ありがとうございます。

私がお聞きしたいのはご指摘いただいたようなことではありません。
Shift-jis コードで書かれたソースファイルの中で宣言する文字列は当然 Shift-jis になります。
それをどこでユニコードに変換しているのでしょうか。

お礼日時:2017/06/19 12:56

>プロパティページの『文字セット』の設定を「ユニコード」から「マルチバイト文字」に、あるいは「マルチバイト文字」を「ユニコード」に変えることは何を意味しているのでしょうか。



_MBCSまたは_UNICODEが定義されるか…の違いがあります。

https://msdn.microsoft.com/ja-jp/library/c426s32 …

他には…CreateFileA()/CreateFileW()などのAPIでワイド文字版とANSI版の切り替えなど。


>私は、「『文字セット』をユニコードに設定することは、プリプロセッサの中で、ソースファイルが勝手にユニコード(多分utf-16)に変換されているのではないか。」と考えています。

文字定数や文字列定数の変換は入っていたような気がしますが…
ソースコード全体のエンコードを変えることはなかったかと。
# TEXT()やT()などで記述している文字定数/文字列定数だけ…だったかも知れませんが。
    • good
    • 0
この回答へのお礼

早速ご連絡ありがとうございます。

例えば『文字セット』がユニコードのプロジェクトに於いて、Shift-jis のソースファイルに:

char
hoge [] = ”hogehoge....”;
[何かの型]
wHoge [] = ”愚かな私”;

と書くと、変数にはASCIIコード、あるいは Shift-jis が入力されることになります。
一体、ユニコードには何時変換されるのでしょう.....

お礼日時:2017/06/19 10:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています