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

时间:2017-03-11 18:41:38

标签: 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()&{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; } ...

或者,在我需要在编码之间进行转换的每个函数实现中创建实例是否更好?

1 个答案:

答案 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。在长时间运行的循环之外转换许多字符串。