我想要实现一个codecvt方面使用ICU从任何字符编码( ICU支持)转换为UTF-8内部。我知道codecvt_byname是存在的,它可以用于实现我想要的部分内容,如这个例子所示。这个例子的问题在于它(1)使用宽字符流(我想使用“规则”,面向字节的流)和(2)需要两个流来执行转换。相反,我想要一个单一的流,比如:
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因此,我想做一个像这这样的实现,但是使用的是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,即如何知道何时到达输入的结束。帮个忙?
发布于 2011-12-30 17:40:22
codecvt方面是,而不是,目的是在不同编码之间进行转换。相反,它将一个字符可能使用多个外部字(通常为字节)编码的外部编码转换为一个内部表示,其中每个字符仅用一个单词(例如char、wchar_t、char16_t等)表示。
从这个角度来看,“结束”一个内部字符序列是没有意义的。如果没有更多可用的外部单词,则进行转换,如果最后一个字符仍然不完整,则这是传输中的一个错误。因此,没有必要表明转换已经完成,相应地,也没有接口。这应该说明,“冲水”的论点确实应该永远是“假的”。
我意识到UTF-8并不完全符合一个字代表一个字符的要求。然而,这将困扰您使用标准类型处理字符串的UTF-8处理。不过,只要你远离syring修改,事情就会正常工作。
“重置”参数可能用于处理流中的搜索。我认为filebuf应该在搜索时提供一个新的state_type对象。这可能是ICU内部设备需要重置的一个迹象。但是,我不知道ICU的接口。因此,我也不知道您是否想提供枢轴缓冲区。
https://stackoverflow.com/questions/8681001
复制相似问题