【问题标题】:How to get boost wdirectory_iterator to return UTF32 on the Mac如何让 boost directory_iterator 在 Mac 上返回 UTF 32
【发布时间】:2010-12-11 04:36:33
【问题描述】:

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、en_GB.US-ASCII、en_GB.UTF-8 都是 8 位的,可能除了 en_GB

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

【问题讨论】:

  • 但我得到的是 UTF-8,而不是 16 或 32,而且我发现的所有参考资料都表明 Mac wchar_t 是 UTF-32。也许我必须从 UTF-8 进行转换,但我想先确定我不会错过更标准的东西。
  • 对不起,大卫,我错了。在 Mac 上,wchar_t 的原生编码取决于 wchar_t 的字节序和大小的组合。

标签: c++ macos boost utf


【解决方案1】:

wdirectory_iteratorbasic_directory_iterator<wpath> 的类型定义。 wpathbasic_path<std::wstring, wpath_traits> 的类型定义。

std::basic_filebuf 中所做的类似,basic_path 使用“内部”编码来表示程序的名称,并使用“外部”编码来与平台的文件系统交互。这些编码之间的转换就像在std::basic_filebuf 中一样,通过使用它所包含的语言环境的std::codecvt 来完成。

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

  • 在您的程序中调用 wpath_traits::imbue() "early",向其传递一个带有执行 UTF8->UTF32 转换的 codecvt facet 的语言环境
  • 或者定义并使用您自己的 Traits 类,您可以在其中实现 to_internal 以执行 UTF8->UTF32 转换

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 2012-11-08
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    相关资源
    最近更新 更多