我正在计划使用 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/