![](/img/trans.png)
[英]std::isalpha throws bad_cast when using with boost::locale
[英]std::bad_cast when using std::basic_istringstream<unsigned short>
我正在嘗試借助std::basic_string
和istringstream
處理UTF-16字符串(放置在緩沖區buf
)。 此代碼中發生異常std::bad_cast
。 我的代碼有問題嗎? 還是gcc的STL不能處理unsigned int
(16位)符號?
const unsigned short * buf;
// ... fiilling buf
std::basic_string<unsigned short> w(buf);
std::basic_istringstream<unsigned short> iss(w);
unsigned int result;
try { iss >> result; }
catch (std::exception& e)
{
const char * c = e.what();
}
與std::wstring
和std::wistringstream
相同的代碼可以正常工作。
在與char
和wchar_t
不同的字符類型上實例化IOStream相當重要。 流需要存在許多std::locale
構面。 沒有它們,它們將無法正常運行。 對於嘗試的操作,您至少需要:
std::ctype<cT>
std::numpunct<cT>
std::num_get<cT>
其中cT
是流的字符類型。 其中的最后一個只需要實例化,而其他的則需要實現。 當然,您還需要通過將其設置為全局語言環境或使用stream.imbue()
來確保為流安裝了std::locale
。
就我個人而言,我認為這總體上是錯誤的方法:進入系統時,字符應轉換為內部表示,離開系統時應轉換為外部表示(這就是std::codecvt<...>
的目的) std::codecvt<...>
方面)。 但是,這似乎是一場失敗的斗爭,人們覺得他們想在內部使用編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.