【发布时间】:2017-03-11 18:41:38
【问题描述】:
我正在计划一个使用 C++Builder 10.1 (Clang 3.3) 的新 C++11 Win32/64 项目,并考虑在核心功能方面以最便携的方式实现它,所以我想将 UTF-8 用于 std::string 编码(另外,因为它是我打算使用的 SQLite C++ 包装器 SQLiteCpp 的默认编码)。
为了与 Win-API 交互,我决定使用 <codecvt> 和 <locale> 的 std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> 中的 .to_bytes() 和 .from_bytes() 函数。
所以,现在我想知道,放置转换器对象的最佳做法是什么。
我应该给它自己的单元和命名空间,例如
.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)?
或者在我需要在编码之间转换的每个函数实现中创建一个实例更好?
【问题讨论】:
-
如果您的唯一目的是 WIn32/64,为什么还需要它便携?如果是这样的话,你还不如忘记转换而只使用 wstring。
-
它适用于Windows现在,将来可能会为其他系统编译。
-
我对@987654331@ 的体验是GCC 和clang 不太支持它。最值得注意的是 Travis CI 上的默认编译器在包含
codecvt标头时会窒息。只是我的两分钱。
标签: c++ c++11 clang c++builder clang++