以下是使用std::codecvt_utf8<>
方面從wchar_t
轉換爲UTF-8的代碼片段。使用Visual Studio 2012,我的期望不符合(請參閱代碼末尾的條件)。我的期望錯了嗎?爲什麼?或者這是一個Visual Studio 2012庫問題?std :: codecvt_utf8方面的問題
#include <locale>
#include <codecvt>
#include <cstdlib>
int main()
{
std::mbstate_t state = std::mbstate_t();
std::locale loc (std::locale(), new std::codecvt_utf8<wchar_t>);
typedef std::codecvt<wchar_t, char, std::mbstate_t> codecvt_type;
codecvt_type const & cvt = std::use_facet<codecvt_type> (loc);
wchar_t ch = L'\u5FC3';
wchar_t const * from_first = &ch;
wchar_t const * from_mid = &ch;
wchar_t const * from_end = from_first + 1;
char out_buf[1];
char * out_first = out_buf;
char * out_mid = out_buf;
char * out_end = out_buf + 1;
std::codecvt_base::result cvt_res
= cvt.out (state, from_first, from_end, from_mid,
out_first, out_end, out_mid);
// This is what I expect:
if (cvt_res == std::codecvt_base::partial
&& out_mid == out_end
&& state != 0)
;
else
abort();
}
這裏的期望是,在一個時間的UTF-8的轉換,但if
上述條件的中間的out()
函數輸出一個字節是與Visual Studio假2012.
失敗的條件是out_mid == out_end
和state != 0
條件。基本上,我希望至少生成一個字節,並且可以生成UTF-8序列的下一個字節的必要狀態存儲在變量state
中。
我不確定你想要反駁的是我期望的部分。你能澄清一下嗎? – wilx
@wilx您希望函數產生一個字節,而不是多字節字符。它從來沒有被指定能夠做到這一點,類似的功能,以及現有的實現被指定爲不這樣做。 – Cubbi
假設你是對的,那麼緩衝區應該有多大呢? '的std :: ::的codecvt MAX_LENGTH()'? – wilx