如何让boost directory_iterator在Mac上返回UTF 32

时间:2009-10-29 10:16:17

标签: c++ macos boost utf

directory_iterator 按预期使用Visual Studio和Xcode返回UTF8。

然而,

wdirectory_iterator 使用Visual Studio返回UTF16,使用Xcode返回UTF8,尽管返回了wchar_t字符串。

我可以更改什么来让wdirectory_iterator返回UTF32?

question I asked previously的回答表明可能需要更改区域设置,但根据'locale -a',可用的唯一区域设置是

en_GB,en_GB.ISO8859-1,en_GB.ISO8859-15,zh_CN.US-ASCII,en_GB.UTF-8 所有都是8位,可能除了en_GB

我尝试了en_GB以防它可能不是8位,但这会导致boost :: filesystem :: exists抛出boost :: filesystem :: wpath :: to_external转换异常。

1 个答案:

答案 0 :(得分:1)

wdirectory_iteratorbasic_directory_iterator<wpath>的typedef。 wpathbasic_path<std::wstring, wpath_traits>的typedef。

std::basic_filebuf中的内容类似,A basic_path使用“内部”编码来表示程序的名称,并使用“外部”编码与平台的文件系统进行交互。这些编码之间的转换与std::basic_filebuf中的转换一样,使用其上嵌入的语言环境的std::codecvt

因此,迭代器通过系统编码中的操作系统获取名称(即“外部”编码),并使用Traits::to_internal转换为“内部”编码。要执行所需的转换,您可以:

  • 在您的程序中“提前”调用wpath_traits::imbue(),将其传递给具有执行UTF8-> UTF32转换的codecvt方面的区域设置
  • 或者定义并使用您自己的Traits类,您可以在其中实施to_internal以执行UTF8-> UTF32转换