私は普段 Gnu 等のコンパイラを使っている物です。Visual Studioが使用する文字コードについて理解できなくて困っています。
どうか愚かな私に一筋の光明をお与えください。
タイトルに示したようにプロパティページの『文字セット』の設定を「ユニコード」から「マルチバイト文字」に、あるいは「マルチバイト文字」を「ユニコード」に変えることは何を意味しているのでしょうか。
デフォルトのVisual studuioでは、今でもソースファイルは Shift-jis です。
私は、「『文字セット』をユニコードに設定することは、プリプロセッサの中で、ソースファイルが勝手にユニコード(多分utf-16)に変換されているのではないか。」と考えています。
私の考えは誤りなのでしょうか?
No.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で作成すると…どちらかが型エラーになります。
ご助言に従い、少しテストしてみました。
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 型で宣言される。
ということと理解しました。お手数をお掛けしましたがありがとうございました。
No.2
- 回答日時:
作成するプログラムが文字(char)を取り扱う際に使用する文字コードを指定します。
Visual StudioはWindowsパソコン上で動作するので既定値はShift-JISとなっています。それだけのことです。
古い説明ですが以下が参考になるでしょう。
https://blogs.msdn.microsoft.com/japan_platform_ …
ご連絡ありがとうございます。
私がお聞きしたいのはご指摘いただいたようなことではありません。
Shift-jis コードで書かれたソースファイルの中で宣言する文字列は当然 Shift-jis になります。
それをどこでユニコードに変換しているのでしょうか。
No.1
- 回答日時:
>プロパティページの『文字セット』の設定を「ユニコード」から「マルチバイト文字」に、あるいは「マルチバイト文字」を「ユニコード」に変えることは何を意味しているのでしょうか。
_MBCSまたは_UNICODEが定義されるか…の違いがあります。
https://msdn.microsoft.com/ja-jp/library/c426s32 …
他には…CreateFileA()/CreateFileW()などのAPIでワイド文字版とANSI版の切り替えなど。
>私は、「『文字セット』をユニコードに設定することは、プリプロセッサの中で、ソースファイルが勝手にユニコード(多分utf-16)に変換されているのではないか。」と考えています。
文字定数や文字列定数の変換は入っていたような気がしますが…
ソースコード全体のエンコードを変えることはなかったかと。
# TEXT()やT()などで記述している文字定数/文字列定数だけ…だったかも知れませんが。
早速ご連絡ありがとうございます。
例えば『文字セット』がユニコードのプロジェクトに於いて、Shift-jis のソースファイルに:
char
hoge [] = ”hogehoge....”;
[何かの型]
wHoge [] = ”愚かな私”;
と書くと、変数にはASCIIコード、あるいは Shift-jis が入力されることになります。
一体、ユニコードには何時変換されるのでしょう.....
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- C言語・C++・C# VisualStudioのソースコードで漢字を使いたい 4 2022/05/21 10:16
- HTML・CSS <meta charset="utf-8"><!-- 文字化け防止ユニコード --> ?最近モバイル 1 2022/12/11 04:27
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Word(ワード) word 文字数のずれ 2 2023/01/18 10:04
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- Visual Basic(VBA) visual basic初心者です。 visual studioで電卓を作成しています。 実行時にテ 1 2023/02/08 00:18
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
VC++ マルチバイト文字とUniCode文字??
C言語・C++・C#
-
VC++でUTF-8のファイルを出力したい
C言語・C++・C#
-
VC++ アプリで中国語を表示したい
C言語・C++・C#
-
-
4
c++std::string型をTCHARに変換したい!
C言語・C++・C#
-
5
関数の実体定義にヘッダファイルの2重定義防止方法が効かない?
C言語・C++・C#
-
6
'const char *' 型は 'char *' 型に変換できない ??
C言語・C++・C#
-
7
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
8
■文字コード判定■
C言語・C++・C#
-
9
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBAでPDFファイルをMicro...
-
CString から LPCTSTRの型に変換
-
文字コードの%E3%80%とは何です...
-
エクセルでの漢字(全角ひらが...
-
【PHP】全角記号を半角記号...
-
VBScript文字列をSJISからUTF8...
-
CString型からdouble型への変換
-
文字コード変換プログラムについて
-
文字化けしてしまって困っています
-
Excelで半角カナのみを全角に変...
-
Visual Studio プロパティペー...
-
改行を含んだ文字列を正規表現...
-
SJIS->UTF8->SJISコード変換に...
-
テキストをhtml変換するには
-
エンコードとコンバートの違い...
-
ローマ字からカナに変換する方...
-
URLが日本語なのになぜ表示...
-
シャープ(#)の受け渡し
-
perlでのcsv形式のテキストファ...
-
VBA で複数の外部フォルダ_テキ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでPDFファイルをMicro...
-
文字コードの%E3%80%とは何です...
-
CString から LPCTSTRの型に変換
-
SJIS->UTF8->SJISコード変換に...
-
Pythonについて。
-
Visual Studio プロパティペー...
-
r18文学賞は文字数ではなく、枚...
-
ローマ字からカナに変換する方...
-
エクセルでの漢字(全角ひらが...
-
日付をシリアル値に変換
-
テキストをhtml変換するには
-
VBScript 全角英数記号→半角英...
-
LINUX上でシリアル通信(C++)
-
漢字からカタカナ変換マクロ
-
VBScript文字列をSJISからUTF8...
-
Pythonについて。
-
gccでiconvを使った文字コード...
-
SQLのデータで半角カナを全角に...
-
【PHP】全角記号を半角記号...
-
CString型からdouble型への変換
おすすめ情報