実際には、この問題は Windows でのみ発生するため、Windows を想定します。
問題は、C++ の狭い拡張実行文字セット(1) (エンコード) が、コンソール ウィンドウで使用されるエンコードと一致しないことです。「ナロー」はタイプを指しchar
ます。「実行文字セット」は、C++ 標準で採用されている正式な用語であり、実行可能ファイルに格納されたテキストに想定されるエンコーディングを指します。コンパイラは、ソース コード リテラルをこのエンコーディングに変換します。また、コンソールのエンコーディングとの間の翻訳など、外部エンコーディングとの間の翻訳も想定されています。

Visual C++ では、コンパイラをだまさない限り、ソース コードのエンコーディングに関係なく、ナロー エンコーディングは常にWindows ANSI (2)です。Visual C++ を使用していると仮定すると、これはご存知の 1 つのエンコーディングです。
コンソール ウィンドウのエンコーディングは、デフォルトで元の IBM PC で使用されているもので、おそらくコードページ 850 (元の IBM PC 英語コードページ 437 の西ヨーロッパ版) です。Windows コマンド インタープリターを実行しますcmd
( Windows-key+ R、 type cmd
、OK)。入力chcp
して、現在のコードページを確認します。入力chcp 1252
して Windows ANSI Western に切り替えます。これはおそらく、マシンの Windows ANSI コードページです。プログラム [.exe] ファイルを実行します。たとえば、フル パスを入力するか、ディレクトリに移動して名前だけを入力します。
[H:\dev\test\0046]
> cl /nologo /EHsc /GR encoding.cpp /Fe:b.exe
エンコーディング.cpp
[H:\dev\test\0046]
> chcp & b
アクティブ コード ページ: 850
Höger elle vänster
höger
←ここには出力がありません。同等とは比較されませんでした。
[H:\dev\test\0046]
> chcp1252
アクティブ コード ページ: 1252
[H:\dev\test\0046]
> b
Höger elle vänster
ホーガー
Du valde höger
[H:\dev\test\0046]
> _
… cl
(元の「Lattice C」の略) は、Visual C++ コンパイラです。
regedit
を実行して、次のレジストリ キーに移動すると、コンソール コードページをより永続的に変更できます。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
右側のペインのリストで、名前が付けられた値 (Original Equipment Manufacturer Code Page の略で、IBM PC を参照) をダブルクリックし、OEMCP
1252 に変更するか、より一般的には値と同じ値に変更しACP
、マシンを再起動します。 .
また、コンソール ウィンドウのフォントをLucida Console などのTrueType フォントに変更する必要があります。これは、デフォルトが元のコンソール コードページでのみ正しく動作するビットマップ フォント (のエミュレーション) であるためです。コンソール ウィンドウのタイトルを右クリックしてメニューを表示し、[デフォルト] を選択して、デフォルトのフォント、サイズ、色などを設定します。変更は現在のコンソール ウィンドウには影響しませんが、今後のコンソール ウィンドウには適用されます。個別に構成されたものについては(3)。
このようなコンソール ウィンドウ構成の代わりに、Console2プログラムを使用することができます。その場合、Windows 7 以降では必ず 64 ビット バージョンを使用してください。そうしないと、64 ビット プログラムへのリンクの呼び出しなど、いくつかのことが機能しなくなります。
要約すると、次のいずれかが可能です
どちらの場合でも、コンソール ウィンドウのフォントを TrueType フォントに変更することをお勧めします。もちろん、これは外観だけでなく機能にも影響します。
追加の Microsoft の不条理についての注意: Windows 7 以降では、コンソール ウィンドウでデフォルトで使用される「システム」フォントは、実際には、舞台裏で、多数のグリフを持つ TrueType フォントですが、古い 16 ビット Windows ビットマップ フォントをエミュレートするために使用されます。 、同じ愚かな制限があるため、他のTrueTypeフォントに変更する必要があります...
(1) C++11 標準 §2.3/3 を参照してください。
(2)「Windows ANSI」は、Windows の構成に依存し、常にGetACP
API 関数によって指定されたコードページです。実際には、この関数は上記のレジストリ キー/値から値を取得します。ただし、それはほとんど文書化されていません。
(3) Windows XP では、個々のコンソール ウィンドウの構成を保存するかどうかを尋ねられます。Windows Vista 以降では、保存されているという情報も質問もされずに保存されます。このように保存された構成を削除するためのユーザー インターフェイスはありませんが、ショートカット ファイルをプログラムで変更したり、レジストリを編集したりすることで削除できますが、これは非現実的で脆い解決策です。