我如何写一个std :: codecvt方面?

我如何写一个std :: codecvt方面? 我想写从UTF-16到UTF-8,从UTF-16到系统当前代码页(窗口,所以CP_ACP),并到系统的OEM代码页(窗口,所以CP_OEM)。

跨平台是首选,但Windows上的MSVC也是好的。 是否有任何types的教程或任何有关如何正确使用这个类的性质?

我写了一个基于iconv的。 它可以在Windows或任何POSIX操作系统上使用。 (你将需要显然与iconv链接)。

请享用

“如何”问题的答案是遵循codecvt的参考 。 两年前,我在互联网上找不到更好的指示。

重要通知

  • 理论上不需要这样的工作。 codecvt_byname应该足够在任何标准的支持平台上。 但实际上有一些编译器不支持或不好支持这个类。 codecvt_byname在不同编译器上的接口也有所不同。
  • 我的工作示例是使用codecvt的状态模板参数实现的。 总是使用标准的mbstate类型,因为这是使用标准iostream类的codecvt的唯一方法。
  • std :: mbstate_t类型不能在64位平台上以跨平台的方式用作指针。
  • 无状态转换适用于短字符串,但如果尝试将数据块转换为大于streambuf内部缓冲区大小(UTF本质上是有状态编码)

这个std :: codecvt的问题是它寻找一个问题的解决方案。 或者说,它试图解决的问题是无法解决的,所以任何试图将其用作解决方案的人都会感到非常失望。

如果你不知道你的输入或输出是哪个字符集,那么std :: codecvt是不会帮助你的。 相反,如果你知道你正在使用哪个字符集,那么你可以在一个函数调用之间进行简单的转换。 在复杂的模板中包装该函数调用不会改变这些基础。

…这就是为什么没有人使用std :: codecvt。 我建议你做别人做的事,假装从来没有发生过。