我如何编写std :: codecvt方面?

时间:2010-06-04 03:48:05

标签: c++ windows codecvt

如何编写std :: codecvt方面?我想写一些从UTF-16到UTF-8的版本,它们从UTF-16到系统当前代码页(windows,所以CP_ACP),再到系统的OEM代码页(windows,所以CP_OEM)。

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

2 个答案:

答案 0 :(得分:9)

我写了一个基于iconv的文章。它可以在Windows或任何POSIX OS上使用。 (你需要明确地与iconv联系)。

Enjoy

“如何”问题的答案是遵循 the codecvt reference。两年前我无法在互联网上找到任何更好的指示。

重要通知

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

答案 1 :(得分:4)

这个std :: codecvt的问题在于它是一个寻找问题的解决方案。或者更确切地说,它试图解决的问题是无法解决的,因此任何试图将其用作解决方案的人都会非常失望。

如果您不知道输入或输出是哪个字符集,那么std :: codecvt将无法帮助您。相反,如果您知道您正在使用哪些字符集,那么您可以通过单个函数调用轻松地在它们之间进行转换。在复杂的模板中包装该函数调用并不会改变这些基本原理。

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