c++ - 在哪里放置 std::wstring_convert<std::codecvt_utf8<wchar_t>>?

标签 c++ c++11 clang c++builder clang++

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

为了与 Win-API 交互,我决定使用 .to_bytes().from_bytes()来自 <codecvt> 的功能的和<locale>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。在转换许多字符串的长时间运行的循环之外。

关于c++ - 在哪里放置 std::wstring_convert<std::codecvt_utf8<wchar_t>>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42739129/

相关文章:

c++ - QML 引擎无法正确导入 C++ 模型

c++ - 使用索引技巧初始化多维数组

c++ - C++ 标准是否明确禁止在通过 constexpr 成员函数指针的调用中使用默认参数?

c++ - 执行 vector c++的交集

c++ - 将 const 限定符应用于模板参数时的不同编译器行为

c++ - 将 char[ ][ ] 的地址复制到 C 字符串

c++ - 四舍五入 - .5 - sprintf

c++ - 由于方法重载,C++移动了语义和代码重复

用 clang 而不是 gcc 编译

c++ - 整个系统的Makefile配置