Codecvt 在 gcc 中不起作用
Codecvt doesn't work in gcc
我正在尝试将我自己的 codecvt
与标准 iostream 一起使用。我正在使用这条线:
std::cout.imbue(std::locale(std::locale("C"), new rot13codecvt()));
rot13codecvt
只是一个例子,无耻地从 the interwebs. A full runnable example is here 中逐字提取。我真正的 codecvt 做了一些不同的事情。
正如您在链接的实时示例中看到的那样,这在 g++ 中完全 不起作用。输出不是 rot13d。自定义 codecvt class 中的函数从未被调用过。但它在 VS2012 中运行良好。
除了 "C" 和 none 之外,我还尝试了其他语言环境。还尝试了一个示例 here,结果相同。
我做错了什么?
g++ 提供的 libstdc++ 尚未实现 c++11 标准。在我的版本中,<codecvt>
header 完全缺失。
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++/
只需要文件流即可使用std::codecvt<...>
,并且不要求任何标准流对象都根据文件流来实现。实施者选择这两种选择都有其原因。 Dinkumware 的实现使用 <stdio.h>
进行大部分操作,在这种情况下使用相同的实现是有意义的。 libstdc++ 避免了一些开销并直接访问标准 C 和 C++ 流之间共享的缓冲区,因此使用不同的流实现。
使用文件流时,std::codecvt<...>
方面的使用应该一致。
codecvt header 从 gcc 5.1 开始存在。
我正在尝试将我自己的 codecvt
与标准 iostream 一起使用。我正在使用这条线:
std::cout.imbue(std::locale(std::locale("C"), new rot13codecvt()));
rot13codecvt
只是一个例子,无耻地从 the interwebs. A full runnable example is here 中逐字提取。我真正的 codecvt 做了一些不同的事情。
正如您在链接的实时示例中看到的那样,这在 g++ 中完全 不起作用。输出不是 rot13d。自定义 codecvt class 中的函数从未被调用过。但它在 VS2012 中运行良好。
除了 "C" 和 none 之外,我还尝试了其他语言环境。还尝试了一个示例 here,结果相同。
我做错了什么?
g++ 提供的 libstdc++ 尚未实现 c++11 标准。在我的版本中,<codecvt>
header 完全缺失。
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++/
只需要文件流即可使用std::codecvt<...>
,并且不要求任何标准流对象都根据文件流来实现。实施者选择这两种选择都有其原因。 Dinkumware 的实现使用 <stdio.h>
进行大部分操作,在这种情况下使用相同的实现是有意义的。 libstdc++ 避免了一些开销并直接访问标准 C 和 C++ 流之间共享的缓冲区,因此使用不同的流实现。
使用文件流时,std::codecvt<...>
方面的使用应该一致。
codecvt header 从 gcc 5.1 开始存在。