首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >把std::wstring_convert<std::codecvt_utf8<wchar_t>>?放在哪里?

把std::wstring_convert<std::codecvt_utf8<wchar_t>>?放在哪里?
EN

Stack Overflow用户
提问于 2017-03-11 18:41:38
回答 1查看 4.2K关注 0票数 2

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

代码语言:javascript
复制
...
#include <codecvt>
#include <locale>

namespace cnv
{
    extern std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> wcu8;
}
...

.cpp:

代码语言:javascript
复制
...
namespace cnv
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> wcu8;
}
...

并包括它在任何地方使用cnv::wcu8.to_bytes(xyz)需要吗?

还是最好在每个函数实现中创建一个实例,以便在编码之间进行转换?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-11 19:38:00

我不会将std::wstring_convert存储在全局变量中,因为这不是线程安全的,也不会给您买多少东西。每次需要实例化std::wstring_convert可能会影响性能,但这不应该是您一开始就关心的主要问题(过早优化)。

所以我就把它打包成函数:

代码语言:javascript
复制
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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42739129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档