gpt4 book ai didi

c++ - 在 Windows 上获取 boost::filesystem::path 作为 UTF-8 编码的 std::string

转载 作者:可可西里 更新时间:2023-11-01 18:37:30 24 4
gpt4 key购买 nike

我们将路径表示为 boost::filesystem::path,但在某些情况下,其他 API 期望它们为 const char *(例如,打开一个数据库使用 SQLite 文件)。

来自 the documentation , path::value_type 在Windows下是一个wchar_t。据我所知,Windows wchar_t 是 2 个字节,UTF-16 编码。

有一个string()返回 std::string 的 native 观察者,同时说明:

If string_type is a different type than String, conversion is performed by cvt.

cvt 被初始化为默认构造的 codecvt。这个默认构造的 codecvt 的行为是什么?

this forum entry ,建议使用 utf8_codecvt_facet 的实例作为 cvt 值以可移植地转换为 UTF-8。但是好像这个codecvt其实是要转换between UTF-8 and UCS-4 ,而不是 UTF-16。

获得 pathstd::string 表示的最佳方式是什么(如果可能的话可移植),确保从正确的 转换>wchar_t 必要时编码?

最佳答案

cvt is initialized to a default constructed codecvt. What is the behaviour of this default constructed codecvt?

它使用默认区域设置转换为特定于区域设置的多字节字符集。在 Windows 上,此区域设置通常对应于控制面板中的区域设置。

What would be the best way (and if possible portable) to obtain an std::string representation of a path, making sure to convert from the right wchar_t encoding when necessary?

C++11 标准介绍 std::codecvt_utf8_utf16 .尽管自 C++17 起已弃用它, 根据 this paper它将可用,“直到合适的替代品被标准化”。

要使用这个方面,调用静态函数:

boost::filesystem::path::imbue( 
std::locale( std::locale(), new std::codecvt_utf8_utf16<wchar_t>() ) );

之后所有调用 path::string()将从 UTF-16 转换为 UTF-8。

另一种方法是使用 std::wstring_convert< std::codecvt_utf8_utf16<wchar_t> >仅在某些情况下进行转换。

完整示例代码:

#include <boost/filesystem.hpp>
#include <iostream>
#include <codecvt>

void print_hex( std::string const& path );

int main()
{
// Create UTF-16 path (on Windows) that contains the characters "ÄÖÜ".
boost::filesystem::path path( L"\u00c4\u00d6\u00dc" );

// Convert path using the default locale and print result.
// On a system with german default locale, this prints "0xc4 0xd6 0xdc".
// On a system with a different locale, this might fail.
print_hex( path.string() );

// Set locale for conversion from UTF-16 to UTF-8.
boost::filesystem::path::imbue(
std::locale( std::locale(), new std::codecvt_utf8_utf16<wchar_t>() ) );

// Because we changed the locale, path::string() now converts the path to UTF-8.
// This always prints the UTF-8 bytes "0xc3 0x84 0xc3 0x96 0xc3 0x9c".
print_hex( path.string() );

// Another option is to convert only case-by-case, by explicitly using a code converter.
// This always prints the UTF-8 bytes "0xc3 0x84 0xc3 0x96 0xc3 0x9c".
std::wstring_convert< std::codecvt_utf8_utf16<wchar_t> > cvt;
print_hex( cvt.to_bytes( path.wstring() ) );
}

void print_hex( std::string const& path )
{
for( char c : path )
{
std::cout << std::hex << "0x" << static_cast<unsigned>(static_cast<unsigned char>( c )) << ' ';
}
std::cout << '\n';
}

关于c++ - 在 Windows 上获取 boost::filesystem::path 作为 UTF-8 编码的 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45572209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com