0

directory_iteratorは、期待どおりにVisualStudioとXcodeの両方を使用してUTF8を返します。

ただし、 wdirectory_iteratorは、wchar_t文字列を返すにもかかわらず、Visual Studioを使用してUTF16を返し、Xcodeを使用してUTF8を返します。

wdirectory_iteratorがUTF32を返すようにするには何を変更できますか?

以前に尋ねた質問への回答は、ロケールの変更が必要になる可能性があることを示唆していますが、「locale -a」によると、使用可能なロケールは

en_GB、en_GB.ISO8859-1、en_GB.ISO8859-15、en_GB.US-ASCII、en_GB.UTF-8 en_GBを除いて、すべて8ビットです。

8ビットではない可能性がある場合に備えてen_GBを試しましたが、これにより、boost :: filesystem::existsがboost::filesystem :: wpath::to_external変換例外をスローします。

4

1 に答える 1

1

wdirectory_iteratorのtypedefですbasic_directory_iterator<wpath>wpathのtypedefですbasic_path<std::wstring, wpath_traits>

で行われるのと同様にstd::basic_filebuf、Abasic_pathは「内部」エンコーディングを使用してプログラムの名前を表し、「外部」エンコーディングを使用してプラットフォームのファイルシステムと対話します。これらのエンコーディング間の変換は、に埋め込まれているロケールstd::basic_filebufを使用して、のように行われます。std::codecvt

したがって、名前は、システムのエンコーディング(つまり「外部」エンコーディング)でオペレーティングシステムからイテレータによって取得され、。を使用して「内部」エンコーディングに変換されTraits::to_internalます。したがって、目的の変換を実行するには、次のことができます。

  • プログラムで「early」を呼び出しwpath_traits::imbue()、UTF8->UTF32変換を実行するcodecvtファセットを持つロケールを渡します
  • または、独自のTraitsクラスを定義して使用します。このクラスではto_internal、UTF8->UTF32変換を実行するために実装します。
于 2009-10-29T13:37:40.667 に答える