C++ 对区域设置编码的解析

C++ 对区域设置编码的解析,c++,boost,unicode,icu,C++,Boost,Unicode,Icu,据我所知,Boost.Filesystem使用本地语言环境编码,我使用ICU的UnicodeString而不是std::string,因为它适用于Unicode。但是,我想将我的UnicodeString转换为本地语言环境结尾的某种std::字符串。我该怎么做? 我希望避免使用C字符串。我认为这给出了您想要的答案: 如果是tl;博士: boost::filesystem::path p; // ... std::string native = p.string(); 我不确定“本机编码”部分

据我所知,Boost.Filesystem使用本地语言环境编码,我使用ICU的UnicodeString而不是std::string,因为它适用于Unicode。但是,我想将我的UnicodeString转换为本地语言环境结尾的某种std::字符串。我该怎么做?
我希望避免使用C字符串。

我认为这给出了您想要的答案:

如果是tl;博士:

boost::filesystem::path p;
// ...
std::string native = p.string();

我不确定“本机编码”部分。文件系统通常没有编码的概念;文件名只是不透明的字节字符串。@Kerrek:也许UNIX文件系统没有,但在Windows中,文件名是UTF-16字符串。如果需要,可以使用“不透明字节字符串”,但只能使用ASCII或代码页之类的格式。@Nicol:不是这样的。NTFS有16位文件名,是的,但没有编码。“不透明16位字符串”是NTFS的情况。@Kerrek:NTFS没有指定编码,但Windows指定。您可能确实存储了一个16位值的非UTF-16字符串,但您也会发现Windows不会显示名称(因为它们不是有效的Unicode字符串)或类似的内容。Boost.Filesystem是建立在操作系统设施之上的,在Windows机器上,这意味着要按照Windows的规则玩。@Nicol:你是说如果你给它传递一个不是有效UTF-16序列的宽字符串,
\u wfopen()
会导致错误吗?