まあ、これはそれを修正する方法を説明していませんが、私は500文字以上が「必要」です:-)
私が(紛らわしい方法で...)説明しようとする前に、あなたが見ている問題は何ですか:プラットフォームのファイル名を条件付けしようとするかもしれません(各プラットフォームを識別するための公式マクロを思い出せません、正しいものと交換してください):
#if defined(LINUX)
const char* Filename="тдöüлотдFILE";
#elif defined(WINDOWS)
const wchar_t* Filename=L"тдöüлотдFILE";
#endif
fstream f(Filename,...);
これでも、ソースコードがコンパイラが期待するエンコーディングである必要があります。それがシステムコードページである場合、これらの文字を文字列リテラルに変換することさえできない可能性があります(ただし、wchar_tバージョンが機能する場合は、文字の整数コードを使用してファイル名を作成することもできます。読みにくくなります。ただし、ソースファイルのエンコーディングには依存しません)。
あなたが扱っている問題は非常に複雑であり、簡単な方法で解決することは不可能かもしれません。
Windowsは内部でUTF16を使用しています(XP、2000、およびNTはUCS2を使用していたため、9xおよび3.xはコードページを使用していました)。LinuxユーザーはほとんどUTF-8に移行していますが、それについて聞いたことがない開発者もいます。しかし、それは改善しています。
現在、UTF-8にはコードページ値がありますが、実際にはシステムコードページにすることはできません。コードページの値は、コードページとUTF-16の間で変換する関数専用ですが、各システムには、UTF-8ではないレガシーコードページがあります。Windowsのレガシーまたは「ANSI」APIはシステムコードページでエンコードされた文字列を受け取りますが、UnicodeAPIはUTF-16でそれらを受け取ります。他に選択肢はありません。
したがって、明らかに、WindowsプログラムはUTF-16を使用するのが好きです。ただし、Linuxはそれをまったく好きではなく、UTF-8を好みます。私は自分のフレームワークを使用して、Windows、Linux、MacOSの間でこのような問題(そしてもちろん他のもの)を活用できるようにしています。Qtなどの既存のフレームワークもそれを行います。そのような助けがなければ、最も安全なオプションはASCIIの文字列リテラルに固執することです。
IDE設定は、ソースコードの保存方法にのみ影響します。ランタイムがリテラルを処理する方法や、ランタイムが最終的に使用するAPIに影響を与えることはできません。
「ANSI」(いいえ、なぜその名前を選んだのかわかりません)やUnicodeを使用してプログラムをコンパイルできるようにするためのMicrosoftの「TCHAR」セットアップを使用するなど、簡単なスイッチで何かを調理してみることができます。私は特に詳しくはありませんが、文字列リテラルの型(TCHARなど)と文字列リテラルのマクロを定義し、Windows API関数の適切なマッピングを行います(「CreateFile」の呼び出しなど)。 CreateFileWまたはCreateFileAの呼び出しになります)。頭に浮かぶオプションの1つは、Windows用のUnicodeとしてコンパイルし、Linux用の適切なものをtypedef / defineして、コードの「char」ベースのバリアントを生成することです。std::stringの代わりにstd::basic_stringを使用する必要がある場合もあります。
補足として、私の知る限り、VisualC++2012はUTF-8およびUTF-16のソースコードを受け入れます。ただし、「char *」リテラルに何が含まれるかはわかりません(私のコードでは、このようなリテラルのASCIIのみを安全側に許可しています。「あいまいな」文字はとにかく文字列ファイルから取得されます。必要なのは次のリテラルのみです。ファイル名、レジストリキー、内部キーなど)。