【问题标题】:Codecvt doesn't work in gccCodecvt 在 gcc 中不起作用
【发布时间】:2015-04-03 20:56:22
【问题描述】:

我正在尝试将我自己的 codecvt 与标准 iostream 一起使用。我正在使用这条线:

std::cout.imbue(std::locale(std::locale("C"), new rot13codecvt()));

rot13codecvt 只是一个例子,从the interwebs 无耻地逐字删除。一个完整的可运行示例是here。我真正的 codecvt 做了一些不同的事情。

正如您在链接的实时示例中看到的那样,这在 g++ 中完全不起作用。输出不是 rot13d。从未调用自定义 codecvt 类中的函数。但它在 VS2012 中运行良好。

我尝试了除“C”之外的其他语言环境,但没有一个有效。还尝试了一个示例here,结果相同。

我做错了什么?

【问题讨论】:

    标签: c++ g++ locale codecvt


    【解决方案1】:

    codecvt 标头从 gcc 5.1 开始存在。

    【讨论】:

      【解决方案2】:

      使用std::codecvt<...> 只需要文件流,并且不要求任何标准流对象都以文件流的形式实现。两种选择的实施者都有其原因。 Dinkumware 的实现在其大部分操作中使用<stdio.h>,在这种情况下,在后台使用相同的实现是有意义的。 libstdc++ 避免了一些开销并直接访问标准 C 和 C++ 流之间共享的缓冲区,因此使用不同的流实现。

      当使用文件流时,std::codecvt<...> facets 的使用应该是一致的。

      【讨论】:

      • 嗯。实际上,该标准仅指定filebuf 使用codecvt,而不是任何其他streambuf。这很烦人。
      【解决方案3】:

      g++ 提供的 libstdc++ 还没有实现 c++11 标准。在我的版本中,<codecvt> 标头完全丢失了。

      f.jardon@xxxx 14:40:40 ~
      $ find /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/ -name codecvt
      
      f.jardon@xxxx 14:41:17 ~
      

      而且它不是唯一缺少的东西:

      f.jardon@xxxx 14:46:22 ~
      $ grep -rl wbuffer_convert 'c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/'
      c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/cvt/wbuffer
      c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/cvt/xtest
      c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/xlocbuf
      
      f.jardon@xxxx 14:46:25 ~
      $ grep -rl wbuffer_convert /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/
      

      【讨论】:

      • 是的,在 n3290 中是章节:22.5。 "标头 为各种字符编码提供了代码转换方面。", (codecvt_utf8, codecvt_ut16, codecvt_ut8_utf16)。
      • @DietmarKühl <codecvt> 导出 std::codecvt 的各种 UTF 相关特化,这些在 g++/libstdc++ 中确实缺失。 std::codecvt 本身仍在 <locale> 中,并且存在于 g++ 中。
      猜你喜欢
      • 1970-01-01
      • 2021-12-07
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多