我正计划使用C ++ Builder 10.1(Clang 3.3)开发一个新的C ++ 11 Win32 / 64项目,并考虑在核心功能方面以最便携的方式实现它,所以我就这样做了。喜欢使用UTF-8进行std::string
编码(也因为它是SQLiteCpp的默认编码,我打算使用的SQLite C ++包装器。)
为了与Win-API进行交互,我决定使用.to_bytes()
&{39}和.from_bytes()
&#39; s <codecvt>
和<locale>
函数{1}}。
所以,现在我想知道放置转换器对象的最佳做法是什么。
我应该给它自己的单位和名称空间,例如
·H
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>
的.cpp:
...
#include <codecvt>
#include <locale>
namespace cnv
{
extern std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> wcu8;
}
...
并将其包含在任何地方以便在需要时使用...
namespace cnv
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> wcu8;
}
...
?
或者,在我需要在编码之间进行转换的每个函数实现中创建实例是否更好?
答案 0 :(得分:2)
我不会将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。在长时间运行的循环之外转换许多字符串。