C++ リテラル "あいうえお" のエンコード

C/C++ が何も分からないので、細かいことを無理に理解しようとせずいろいろやってみたい今日この頃。実行環境は Visual Studio 2022

char s[] = "あいうえお" のエンコード

#include <iostream>
using namespace std;

int main()
{
    char s[] = "あいうえお";
    cout << s << endl;
}

として実行すると、デバッグコンソールに あいうえお と表示される。問題はこのときのコードポイントが 932 (ANSI/OEM - Japanese Shift JIS) だということ。特に明示的にエンコードしていないが、どうやら Shift JIS エンコードされているらしい。

"あいうえお" のサイズ

Visual Studio 上で "あいうえお" にマウスオーバーすると (const char [11])"あいうえお" と出る。内部的に何らかのエンコーディングが施されていて、(文字列終端を除けば) 1文字あたり2バイト使っている計算。

"あいうえお" を1byteずつ表示させてみる

#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    char s[] = "あいうえお";

    cout << s << endl;

    for (int k = 0; k < sizeof s; k++) {
        printf("%X ", (unsigned char)s[k]);
    }
}

実行結果

あいうえお
82 A0 82 A2 82 A4 82 A6 82 A8 0

文字コード表 シフトJIS(Shift_JIS) を見て確認。Shift JIS としてエンコードされており、ビッグエンディアンで格納されていることがわかる。

まとめ

正確なところはよくわからないが、Visual Studioコンパイラ設定?として非ASCII 文字リテラルを環境に応じていい感じにエンコードするようにしてくれているのかもしれない。