コンソールでUTF-8
の出力を行いたいのに、WindowsのデファクトスタンダードがSJISで設定に戸惑う…ということが、稀にあるかと思います。
本記事では、C++使用時にUTF-8
でのコンソール出力の方法をまとめます。
環境
- VisualStadio2022
- C++23
設定
本記事ではコンソールでUTF-8
を扱うために、u8string
というクラスを使用します。
そのためには言語規格がC++20
以降である必要があります。
最新版がよろしいかと思いますので、基本的には現時点での最新版にすることを強く勧めます。
本記事ではC++23
への変更を行います。
言語規格の変更方法
画面上部GUIからプロジェクト
->プロパティ
をクリックでプロパティページを開きます。
構成プロパティ
->C/C++
->言語
->C++言語標準
の右UI∨
をクリックし、C++23
を選択(今回はC++20
以降ならOK)
プロパティページの右下の適用
をクリックし、変更の適用を行います。
実装
C++
では、<windows.h>
内のSetConsoleOutputCP()
関数を利用することで、コンソールに出力する文字コードを変更することが出来ます。
UTF-8
に変更するためのマクロはCP_UTF8
です。
文字列型にはstd::u8string
を使用し、出力時にはreinterpret_cast
で出力できる型(const char*
)に変換することで、UTF-8
での出力が実現できます。
#include <iostream>
#include <windows.h>//SetConsoleOutputCP()を使用するために必要
#include <string>
int main() {
SetConsoleOutputCP(CP_UTF8);//出力コードをUTF-8に設定
std::u8string s = u8"こんにちは、世界";//UTF-8文字列リテラル
//出力できる型に変換を行って出力
std::cout << reinterpret_cast<const char*>(s.c_str()) << std::endl;
system("pause");
return 0;
}
こんにちは、世界
Press any key to continue . . .
ここで文字化けせずに出力されていたら、UTF-8
での出力が成功となります。
総括
-
u8string
を扱うためには、C++
の言語規格をC++20
以上にする必要がある。 -
<windows.h>
内のSetConsoleOutputCP()
関数を利用することで、コンソールに表示する文字コードを変更できる。 -
u8string
をstd::cout
で出力する際には、reinterpret_cast
で出力できる型(const char*
)に変換する必要がある。