![](/img/trans.png)
[英]codecvt_utf8<wchar_t> gets converted to native codecvt<wchar_t, char>
[英]Where to put std::wstring_convert<std::codecvt_utf8<wchar_t>>?
我正在計划一個帶有C ++ Builder 10.1(Clang 3.3)的新C ++ 11 Win32 / 64項目,並考慮在涉及核心功能時以最可移植的方式實現它,因此我想使用UTF- 8為std::string
編碼(並且,因為它是SQLiteCpp的默認編碼,我打算使用SQLite C ++包裝器)。
為了與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)
?
還是在需要在編碼之間進行轉換的每個函數實現中創建一個實例更好?
我不會將std::wstring_convert
存儲在全局變量中,因為它不是線程安全的,並且不會給您帶來太多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
,例如,在長時間運行的循環中,該循環可以轉換許多字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.