首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ICU实现我自己的codecvt方面

使用ICU实现我自己的codecvt方面
EN

Stack Overflow用户
提问于 2011-12-30 15:25:44
回答 1查看 664关注 0票数 0

我想要实现一个codecvt方面使用ICU从任何字符编码( ICU支持)转换为UTF-8内部。我知道codecvt_byname是存在的,它可以用于实现我想要的部分内容,如这个例子所示。这个例子的问题在于它(1)使用宽字符流(我想使用“规则”,面向字节的流)和(2)需要两个流来执行转换。相反,我想要一个单一的流,比如:

代码语言:javascript
复制
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()的实现是:

代码语言:javascript
复制
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编码。

我的问题是:

  1. 我应该为上面的“枢轴”缓冲区指定nullptr,还是提供我自己的?
  2. 我不确定何时(如果有的话)应该将reset参数(目前是上面的第一个false )设置为true
  3. 不清楚如何知道何时将flush参数(目前是上面的第二个false )设置为true,即如何知道何时到达输入的结束。

帮个忙?

EN

回答 1

Stack Overflow用户

发布于 2011-12-30 17:40:22

codecvt方面是,而不是,目的是在不同编码之间进行转换。相反,它将一个字符可能使用多个外部字(通常为字节)编码的外部编码转换为一个内部表示,其中每个字符仅用一个单词(例如char、wchar_t、char16_t等)表示。

从这个角度来看,“结束”一个内部字符序列是没有意义的。如果没有更多可用的外部单词,则进行转换,如果最后一个字符仍然不完整,则这是传输中的一个错误。因此,没有必要表明转换已经完成,相应地,也没有接口。这应该说明,“冲水”的论点确实应该永远是“假的”。

我意识到UTF-8并不完全符合一个字代表一个字符的要求。然而,这将困扰您使用标准类型处理字符串的UTF-8处理。不过,只要你远离syring修改,事情就会正常工作。

“重置”参数可能用于处理流中的搜索。我认为filebuf应该在搜索时提供一个新的state_type对象。这可能是ICU内部设备需要重置的一个迹象。但是,我不知道ICU的接口。因此,我也不知道您是否想提供枢轴缓冲区。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8681001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档