【问题标题】:Transcoding characters on-the-fly using iostreams and ICU使用 iostreams 和 ICU 即时转码字符
【发布时间】:2011-12-10 01:04:38
【问题描述】:

我想即时对字符编码进行转码。我想使用 iostreams 和我自己的转码 streambuf,例如:

xcoder_streambuf xbuf( "UTF-8", "ISO-8859-1", cout.rdbuf() );
cout.rdbuf( &xbuf );

char *utf8_s;    // pointer to buffer containing UTF-8 encoded characters
// ...
cout << utf8_s;  // characters are written in ISO-8859-1

xcoder_streambuf 的实现将使用 ICU 的转换器 API。它会获取传入的数据(在这种情况下,来自utf8_s),对其进行转码,然后使用iostream 的原始steambuf 将其写出。

这是一个合理的方法吗?如果没有,什么会更好?

【问题讨论】:

    标签: c++ unicode character-encoding iostream icu


    【解决方案1】:

    这是一个合理的方法吗?

    是的,但这不是您在现代(如 1997 年)iostream 中所期望的方式。

    通过basic_streambuf&lt;&gt; 输出的行为由overflow(int_type c) 虚函数定义。

    basic_filebuf&lt;&gt;::overflow(int_type c = traits::eof())的描述包括a_codecvt.out(state, b, p, end, xbuf, xbuf+XSIZE, xbuf_end);,其中a_codecvt定义为:

    const codecvt<charT,char,typename traits::state_type>& a_codecvt 
         = use_facet<codecvt<charT,char,typename traits::state_type> >(getloc());
    

    所以您应该使用适当的codecvt&lt;charT,char,typename traits::state_type&gt; 转换器imbuelocale

    codecvt&lt;internT,externT,stateT&gt; 类用于从一种字符编码转换为另一种字符编码,例如从宽字符转换为多字节字符或在 Unicode 和 EUC 等宽字符编码之间转换。

    自 1997 年以来,对 Unicode 的标准库支持取得了一些进展:

    专业化 codecvt 在 UTF-32 和 UTF-8 编码方案之间进行转换。

    这似乎是您想要的(ISO-8859-1 代码是 USC-4 代码 = UTF-32)。

    如果没有,什么会更好?

    我将为 UTF8 介绍一种不同的类型,例如:

    结构 utf8 { 无符号字符 d; // d 代表数据 }; 结构拉丁语1 { 无符号字符 c; // c 代表字符 };

    这样,您就不会意外地在需要 ISO-8859-* 的地方传递 UTF8。但是你必须编写一些接口代码,并且你的流的类型不会是istream/ostream

    免责声明:我从来没有真正做过这样的事情,所以我不知道它在实践中是否可行。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多