- filesystem[meta header]
- std::filesystem[meta namespace]
- path[meta class]
- function[meta id-type]
- cpp17[meta cpp]
- cpp26deprecated[meta cpp]
template <class EcharT,
class traits = std::char_traits<EcharT>,
class Allocator = std::allocator<EcharT>>
std::basic_string<EcharT, traits, Allocator>
string(const Allocator& a = Allocator()) const; // (1)
std::string string() const; // (2)(2)は、C++26で非推奨となった。システム依存エンコーディングへの変換であることを明確にしたsystem_encoded_string()、もしくは表示に適したdisplay_string()を使用すること。
- (1) : 指定された文字型に対応する文字コードで、パス文字列を取得する
- (2) : システムのマルチバイト文字コードで、パス文字列を取得する
*thisが保持するシステムのネイティブフォーマットを持つパスを、指定された文字型の文字コードで返す。
(1) の場合、戻り値の文字列をメモリアロケートするために、パラメータaのアロケータを使用する。
- (1) :
ECharTがcharの場合、システムのマルチバイト文字コードとなる (POSIXベースシステムではUTF-8、Windowsの日本語環境ではCP932)ECharTがwchar_tの場合、システムのワイド文字コードとなる (WindowsではUTF-16)ECharTがchar8_tの場合、UTF-8エンコーディングとなるECharTがchar16_tの場合、UTF-16エンコーディングとなるECharTがchar32_tの場合、UTF-32エンコーディングとなる
- (2) :
- POSIXベースシステムではUTF-8、Windowsの日本語環境ではCP932文字コードとなる
(2)が返すシステム依存のパス名エンコーディングは、iostream・std::format()・std::print()を含むほぼすべての標準のテキスト処理・入出力機能と互換性がなく、文字化けやデータ損失の原因になりやすい。C++26ではこの問題を避けるために(2)が非推奨となり、用途に応じて以下の代替関数が追加された:
- レガシーなシステムAPIにパスを渡す場合 :
system_encoded_string()((2)と同じ動作) - 表示・フォーマットする場合 :
display_string()、std::format()、std::print()
なお、テンプレート版である(1)は非推奨となっていない。
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
fs::path p = "/usr/bin/clang";
// (1)
{
const std::string s = p.string<char>();
const std::wstring ws = p.string<wchar_t>();
const std::u16string utf16s = p.string<char16_t>();
const std::u32string utf32s = p.string<char32_t>();
std::cout << s << std::endl;
}
// (2)
{
const std::string s = p.string();
std::cout << s << std::endl;
}
}- p.string[color ff0000]
/usr/bin/clang
/usr/bin/clang
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
fs::path p = "foo/bar";
// (1)
{
const std::string s = p.string<char>();
const std::wstring ws = p.string<wchar_t>();
const std::u16string utf16s = p.string<char16_t>();
const std::u32string utf32s = p.string<char32_t>();
std::cout << s << std::endl;
}
// (2)
{
const std::string s = p.string();
std::cout << s << std::endl;
}
}- p.string[color ff0000]
foo/bar
foo/bar
- C++17
- Clang:
- GCC: 8.1 [mark verified]
- Visual C++: 2017 Update 7 [mark verified]
system_encoded_string()(システム依存エンコーディングで取得する。(2)の代替)display_string()(表示用のリテラルエンコーディングで取得する)native()(システムの文字コードでパス文字列を取得する)
- P2319R5 Prevent path presentation problems
- 非テンプレート版の(2)がC++26で非推奨となり、
system_encoded_string()・display_string()が代替として追加された
- 非テンプレート版の(2)がC++26で非推奨となり、