std::wstring_convert<std::codecvt_utf8<wchar_t>> 放在哪里?

Where to put std::wstring_convert<std::codecvt_utf8<wchar_t>>?

我正在计划使用 C++Builder 10.1 (Clang 3.3) 的新 C++11 Win32/64 项目,并考虑在涉及核心功能时以最可移植的方式实现它,所以我我想将 UTF-8 用于 std::string 编码(而且,因为它是 SQLiteCpp 的默认编码,我打算使用 SQLite C++ 包装器)。

为了与 Win-API 交互,我决定使用 <codecvt><locale>.to_bytes().from_bytes() 函数 std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>.

所以,现在我想知道放置转换器对象的最佳做法是什么。

我应该给它自己的单位和命名空间吗,例如

.h:

...
#include <codecvt>
#include <locale>

namespace cnv
{
    extern std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> wcu8;
}
...

.cpp:

...
namespace cnv
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> wcu8;
}
...

并将其包含在任何地方以在需要的地方使用 cnv::wcu8.to_bytes(xyz)

还是在我需要在编码之间转换的每个函数实现中创建一个实例更好?

我不会将 std::wstring_convert 存储在全局变量中,因为这不是线程安全的并且不会给你带来太多好处。每次需要时实例化 std::wstring_convert 可能会影响性能,但这不应该是您开始时的主要关注点(过早优化)。

所以我只是把它包装成函数:

std::wstring utf8_to_wstr( const std::string& utf8 ) {
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> wcu8;
    return wcu8.from_bytes( utf8 );
}

std::string wstr_to_utf8( const std::wstring& utf16 ) {
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> wcu8;
    return wcu8.to_bytes( utf16 );
}

你必须在某处捕获 std::range_error 异常。如果由于某种原因(无效代码点等)转换失败,它可以由 std::wstring_convert 抛出。

如果您稍后在字符串转换方面遇到性能瓶颈,您仍然可以直接在代码的关键点实例化 std::wstring_convert,例如。 G。在转换许多字符串的长 运行 循环之外。