我想實現codecvt
方面使用ICU從任何字符編碼(ICU支持)轉換爲UTF-8內部。我知道codecvt_byname
存在,它可以用來做我想要的一部分,如this example所示。這個例子的問題是它(1)使用寬字符流(我想使用「常規」,面向字節的流)和(2)需要2個流來執行轉換。相反,我要像一個單一的數據流:使用ICU實現我自己的編碼方面
locale loc(locale(), new icu_codecvt("ISO-8859-1"));
ifstream ifs;
ifs.imbue(loc);
ifs.open("/path/to/some/file.txt");
// data read from ifs here will have been converted from ISO-8859-1 to UTF-8
因此,我的魔杖做一個類似的實現,但this使用ICU而不是iconv
。 鑑於此,我的實現的do_in()
是:
icu_codecvt::result icu_codecvt::do_in(state_type &state,
extern_type const *from, extern_type const *from_end,
extern_type const *&from_next, intern_type *to,
intern_type *to_end, intern_type *&to_next) const {
from_next = from;
to_next = to;
if (always_noconv_)
return noconv;
our_state *const s = state_store_.get(state);
UErrorCode err = U_ZERO_ERROR;
ucnv_convertEx(
s->utf8_conv_, s->extern_conv_, &to_next, to_end, &from_next, from_end,
nullptr, nullptr, nullptr, nullptr, false, false, &err
);
if (err == U_TRUNCATED_CHAR_FOUND)
return partial;
return U_SUCCESS(err) ? ok : error;
}
的our_state
對象維護兩個UConverter*
指針,一個用於「外部」編碼(在本例中,ISO-8859-1)和一個用於UTF-8編碼。
我的問題是:
- 我應該指定
nullptr
爲「支點」爲上述緩衝液,或提供自己的? - 我不確定何時,如果有的話,我應該將
reset
參數(現在是第一個false
以上)設置爲true
。 - 我不知道如何知道何時將
flush
參數(當前是第二個false
)設置爲true
,即我如何知道何時已達到輸入的結尾。
有一點幫助嗎?
您應該在打開文件之前灌注()您的文件流。如果文件已經打開,很多系統會默默地忽略imbue()(這是因爲關於對話的狀態可能已經丟失)。 – 2011-12-30 15:54:15
完成。其餘的答案? – 2011-12-30 16:01:59