我正计划使用C++11 10.1 (Clang3.3)开发一个新的C++Builder Win32 32/64项目,并考虑在涉及核心函数时以最可移植的方式实现它,因此我想使用UTF-8进行std::string编码(而且,因为它是C++Builder(打算使用的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)需要吗?
还是最好在每个函数实现中创建一个实例,以便在编码之间进行转换?
发布于 2017-03-11 19:38:00
我不会将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。
https://stackoverflow.com/questions/42739129
复制相似问题