16

エンコーディングを扱うサンプル プログラムをいくつか作成したいと考えています。具体的には、次のようなワイド文字列を使用したいと考えています。

wstring a=L"grüßen";
wstring b=L"שלום עולם!";
wstring c=L"中文";

これらはサンプルプログラムだからです。

これは、ソース コードを UTF-8 でエンコードされたテキストとして扱う gcc ではまったく問題ありません。ただし、単純なコンパイルは MSVC では機能しません。エスケープ シーケンスを使用してエンコードできることはわかっていますが、読みやすいテキストとして保持したいと考えています。

これを機能させるために、"cl" のコマンド ライン スイッチとして指定できるオプションはありますか? gcc'c のようなコマンド ライン スイッチはあります-finput-charsetか?

そうでない場合、どのようにテキストをユーザーにとって自然にすることを提案しますか?

注: BOM を UTF-8 ファイルに追加することは、他のコンパイラではコンパイルできなくなるため、オプションではありません。

注 2: MSVC バージョン >= 9 == VS 2008 で動作させる必要があります

本当の答え:解決策はありません

4

5 に答える 5

14

「遅刻はしないよりはまし」というモットーに賛同する人のために、Visual Studio 2015 (コンパイラのバージョン 19) がこれをサポートするようになりました。

新しい/source-charsetコマンド ライン スイッチを使用すると、ソース ファイルの解釈に使用する文字セット エンコーディングを指定できます。これは、 IANAまたは ISO 文字セット名のいずれかである単一のパラメーターを取ります。

/source-charset:utf-8

または特定のコード ページの 10 進数の識別子 (ドットが前に付く):

/source-charset:.65001

公式ドキュメントはこちらです。Visual C++ チーム ブログには、これらの新しいオプションについて説明した詳細な記事もあります。

まったく同じように機能する補完的な/execution-charsetスイッチもありますが、実行可能ファイルで生成される文字リテラルと文字列リテラルの範囲を制御します。/utf-8最後に、 と の両方を設定するショートカット スイッチ が/source-charset:utf-8あり/execution-charset:utf-8ます。

これらのコマンド ライン オプションは、oldおよびディレクティブと互換性がなく、すべてのソース ファイルにグローバルに適用されます。#pragma setlocale#pragma execution-character-set

ユーザーが古いバージョンのコンパイラに固執している場合、最良のオプションは、ソースファイルを BOM 付きの UTF-8 として保存することです (他の回答が示唆しているように、IDE は保存時にこれを実行できます)。コンパイラはこれを自動的に検出し、適切に動作します。GCC も同様です。GCC は、窒息死することなくソース ファイルの先頭で BOM を受け入れ、このアプローチを機能的に移植可能にします。

于 2016-06-10T09:14:30.280 に答える
8

エンコーディングコンボでFile->Advances Save Options... 選択を開きます。Unicode(UTF-8 with signature) - Codepage 65001コンパイラは、選択されたエンコーディングを自動的に使用します。


ここのマイクロソフトの回答によると:

非ASCII文字が必要な場合、それらを取得するための「公式」で移植可能な方法は、\u(または\U)16進数エンコーディングを使用することです(これは、単純に醜く、エラーが発生しやすいことに同意します)。

コンパイラは、BOM を持たないソース ファイルに直面すると、ファイルを一定距離先読みして、Unicode 文字を検出できるかどうかを確認します。検出できない場合は、特に UTF-16 と UTF-16BE を探します。いずれかが見つからない場合、MBCS があると見なされます。この場合、MBCS にフォールバックし、これが問題の原因であると思われます。

明示的であることは本当に最善であるため、それが完璧な解決策ではないことはわかっていますが、 BOM を使用することをお勧めします。

Jonathan Caves
Visual C++ コンパイラ チーム。


適切な解決策は、テキスト文字列をリソース ファイルに配置することです。便利でポータブルな方法です。gettextなどのローカリゼーション ライブラリを使用して翻訳を管理できます。

于 2009-11-02T12:03:53.597 に答える
2

使用したフロー: ファイルを BOM 付きの UTF8 として保存し、Linux と Windows 間で同じソースを共有します。Linux の場合: BOM を削除するためにコンパイル コマンドでソース ファイルを前処理し、中間の非 BOM ファイルで g++ を実行します。

于 2012-06-12T10:12:01.310 に答える
1

VSの場合、次を使用できます。

#pragma setlocale( "[locale-string]" )

ロケールのデフォルトのANSIコードページがファイルエンコーディングとして使用されます。

ただし、一般に、ユーザーに表示される文字列をコードにハードコーディングすることはお勧めできません。それらをある種のリソースに保存します。ローカリゼーション、簡単なスペルチェックと更新などに適しています。

于 2009-11-11T08:19:43.097 に答える
1

私見では、すべての C++ ソース ファイルは厳密な ASCII である必要があります。エディターがサポートしている場合、コメントは UTF-8 にすることができます。
これにより、コードはプラットフォーム、エディター、およびソース管理システム間で移植可能になります。

\uUnicode 文字をワイド文字列に挿入するために使用できます。

std::wstring str = L"\u20AC123,00"; //€123,00
于 2009-11-12T14:34:11.540 に答える