8

Windows 7 64 ビットで Microsoft Visual Studio 2010 を使用しています。(プロジェクトのプロパティで「文字セット」が「未設定」に設定されていますが、どの設定でも同じ出力になります。)

ソースコード:

  using namespace std;
  char const charTest[] = "árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP\n";
  cout << charTest;
  printf(charTest);
  if(set_codepage()) // SetConsoleOutputCP(CP_UTF8); // *1
    cerr << "DEBUG: set_codepage(): OK" << endl;
  else
    cerr << "DEBUG: set_codepage(): FAIL" << endl;
  cout << charTest;
  printf(charTest);

*1: 含めるwindows.hとめちゃくちゃなので、別の cpp から含めています。

コンパイルされたバイナリには、文字列が正しい UTF-8 バイト シーケンスとして含まれています。を使用してコンソールを UTF-8 に設定するchcp 65001type main.cpp、文字列が正しく表示されます。

テスト (Lucida Console フォントを使用するように設定されたコンソール):

D:\dev\user\geometry\Debug>chcp
Active code page: 852

D:\dev\user\geometry\Debug>listProcessing.exe
├írv├şzt┼▒r┼Ĺ t├╝k├Ârf├║r├│g├ęp ├üRV├ŹZT┼░R┼É T├ťK├ľRF├ÜR├ôG├ëP
├írv├şzt┼▒r┼Ĺ t├╝k├Ârf├║r├│g├ęp ├üRV├ŹZT┼░R┼É T├ťK├ľRF├ÜR├ôG├ëP
DEBUG: set_codepage(): OK
��rv��zt��r�� t��k��rf��r��g��p ��RV��ZT��R�� T��K��RF��R��G��P
árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP

その背後にある説明は何ですか?coutとして働くように頼むことはできますprintfか?

添付ファイル

多くの人が、Windows コンソールは UTF-8 文字をまったくサポートしていないと言っています。私はハンガリー在住のハンガリー人です。私の Windows は英語に設定されています (日付形式以外はハンガリー語に設定されています)。ハンガリー語の文字の横にキリル文字が正しく表示されます。

コンソールにハンガリー語とキリル文字を同時に表示

(私のデフォルトのコンソールコードページは CP852 です)

4

4 に答える 4

4

ここでの違いは、C++ランタイムとCライブラリがシステムロケールを処理する方法です。

std :: coutで同じ結果を得るには、std :: ios::imbueメソッドとstd::localeを試してください。

しかし、ここで説明されているutf-8とC++の主な問題

C ++ 03は、2種類の文字列リテラルを提供します。二重引用符で囲まれた最初の種類は、constchar型のnullで終了する配列を生成します。L ""として定義される2番目の種類は、タイプconst wchar_tのnullで終了する配列を生成します。ここで、wchar_tはワイド文字です。どちらのリテラル型も、UTF-8、UTF-16、またはその他の種類のUnicodeエンコーディングを使用した文字列リテラルのサポートを提供していません。

とにかく、標準のC ++出力ストリームのいずれもutf-8を理解できないため、すべて実装固有であり、したがって移植性がありません。

于 2012-09-28T09:57:26.520 に答える
2

私の理解では、コマンドラインはUTF-8で動作するようです

  1. UTF-8 文字を表示できるフォント
  2. コマンド ラインで正しいコード ページを設定します (chcp 65001)。このコード ページが完全な UTF-8 文字をサポートしているかどうかはわかりませんが、利用可能な最良のコード ページのようです。

こちらこちらをご覧ください

[編集] 65001PowerShellでチェックインした後、実際にはUTF-8です

PS C:\Users\forcewill> chcp 65001
Active code page: 65001
PS C:\Users\forcewill>  [Console]::OutputEncoding


BodyName          : utf-8
EncodingName      : Unicode (UTF-8)
HeaderName        : utf-8
WebName           : utf-8
WindowsCodePage   : 1200
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
IsSingleByte      : False
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 65001

古いcmd.exeよりもはるかに強力なPowerShellを使用できます

Edit:ビジュアル スタジオで話している場合の cout の使用については、正解はこちらです。より詳細な説明は、ビジュアル スタジオ内のベスト プラクティスについてここにあります。

于 2012-10-01T22:24:59.977 に答える
1

Windows では、通常、シングルバイト文字列は ASCII または 256 文字のコードページとして解釈されます。つまり、実際の Unicode サポートが得られないということです。

簡単な答えは次のとおりです。ワイド文字列を使用して (たとえばL""árvíztűr..."、L に注意してください)、wcout代わりに に書き込みcoutます。Windows は通常、ワイド (Windows では 2 バイト) 文字列を UTF-16 (または少なくともそれに近いバリアント) として解釈するため、意図したとおりに機能します。Windows では、エンコードの問題を回避するために常にワイド文字列を使用してください。

于 2012-09-22T16:00:17.980 に答える
1

まず、Windows コンソールは UTF-8 をサポートしていません (コードページ 65001、これをテストするために、コンソールのメモ帳で保存された UTF-8 エンコード ファイルを開くと、コンソールにジャンク データが表示されます)。出力をファイルなどにリダイレクトし、そこから結果を確認する必要があります (myapp > test.txt)。

C/C++ char[] の 2 番目は、プログラマーが望む方法で解釈できる一連の文字ですが、UTF-8 は Unicode 文字セットをエンコードするための特別なプロトコルであるため、(C++11 以外に) 記述する方法はありません。文字のシーケンスと UTF8 でエンコードされた文字char p[3] = "اب"ですが、コンパイラがこれを UTF-8 でエンコードしたい場合は、3 バイトではなく 5 バイトが必要なので、UTF-8 を理解できるものを使用する必要があります。

boost::locale::conv::utf_to_utfワイド文字列定数を使用することをお勧めします。例えば

std::string sUTF8 = boost::locale::conv::utf_to_utf(L"árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP\n");
std::cout << sUTF8; // or printf( "%s", sUTF8.c_str() );

これにより、UTF-8 文字列があることが保証されますが、UTF-8 をまったく理解しないため、コンソールで確認しないでください!!.

于 2012-10-01T12:37:31.407 に答える