9

UNICODEVisual C++ で新しいプロジェクトを作成すると、デフォルトで に設定されUNICODEます。
そして、優れた Windows プログラマーになろうとしている私は、 を使いたいと思っていますUNICODE

問題は、C++ 標準ライブラリと STL ( std::stringstd::runtime_errorなど) が文字列でうまく機能しないことですUNICODEstd::string、または achar*std::runtime_errorに渡すことしかできません。 std::stringがサポートしていないと確信していUNICODEます。

私の質問は、std::runtime_errorなどをどのように使用すればよいですか? UNICODEレギュラーとミックスするべきANSI?(これは悪い考えだと思います...)プロジェクト全体で
使用するだけですか?ANSI(好まない..)または何?

4

4 に答える 4

9

一般に、これら 2 つのエンコーディングを混在させるべきではありません。ただし、例外メッセージは開発者のみが関心を持つもの(ログ ファイルなど) であり、ユーザーには表示されるべきではありません (ただし、重要な警告については Jim のコメントを参照してください)。

UNICODEしたがって、ユーザー向けインターフェース全体に使用しstd::exception、開発者メッセージの舞台裏で etc.を使用する場合は安全です。2 つの間で変換する必要はありません。

さらに、 C++ でtypedeffor に依存しない文字列を定義するのは良いトリックです。UNICODE

typedef std::basic_string<TCHAR> tstring;

…そして同様tcouttcinなどを条件付きで定義します:

#ifdef UNICODE
    std::wostream& tcout = std::wcout;
    std::wostream& tcerr = std::wcerr;
    std::wostream& tclog = std::wclog;
    std::wistream& tcin = std::wcin;
#else
    std::ostream& tcout = std::cout;
    std::ostream& tcerr = std::cerr;
    std::ostream& tclog = std::clog;
    std::istream& tcin = std::cin;
#endif
于 2012-03-08T19:37:43.610 に答える
2

ジョシュ、

ここで私の答えを見てください:https://softwareengineering.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful

std::string は Windows 上の Unicode に最適であり、ポータブルで Unicode 対応のプログラムをより速く作成する正しい方法であると考えるエンジニアが増えています。

于 2012-03-10T18:49:19.363 に答える
1

CodeProject に関するこの (かなり古い) 記事を見てみましょう: STL ベースのアプリケーションを Unicode を使用するようにアップグレードします。STL を広範囲に使用している場合に発生する可能性が高い問題について説明します。それほど悪くはないはずです。一般的に言えば、幅の広い文字列を使用する価値はあります。

于 2012-03-08T19:37:52.833 に答える
0

Windows Unicode API を使用するには、ワイド文字列バージョン (wstring など) を使用するだけです。これは では役に立ちませんexception::what()が、本当に Unicode が必要な場合は、UTF-8 エンコーディングを使用できます。

于 2012-03-08T19:35:49.887 に答える