首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写std::codecvt facet?

如何编写std::codecvt facet?
EN

Stack Overflow用户
提问于 2010-06-04 11:48:05
回答 2查看 5.8K关注 0票数 13

如何编写std::codecvt facet?我想写从UTF-16到UTF-8的代码,从UTF-16到系统的当前代码页(windows,so CP_ACP),以及系统的OEM代码页(windows,so CP_OEM)。

跨平台是首选,但Windows上的MSVC也很好。有没有任何关于如何正确使用这个类的教程或类似的东西?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-07 15:27:29

我已经写了一个基于iconv的。它可以在windows或任何POSIX OS上使用。(您显然需要使用iconv进行链接)。

Enjoy

“怎么做”这个问题的答案是遵循 the codecvt reference。两年前,我在互联网上找不到更好的说明。

重要注意事项

  • 理论上不需要这样的工作。在任何支持标准的平台上,codecvt_byname都应该足够了。但在现实中,有一些编译器不支持或很差地支持这个类。在不同的编译器上,codecvt_byname的接口也是不同的,
  • 我的工作例子是用codecvt的状态模板参数实现的。始终使用标准的mbstate类型,因为这是使用标准iostream classes.
  • std::mbstate_t类型的唯一方法在64位平台上不能将其用作跨平台way.
  • stateless转换中的指针。如果您尝试转换大于streambuf内部缓冲区大小的数据块(UTF本质上是有状态编码)

,则可能会失败

票数 12
EN

Stack Overflow用户

发布于 2010-06-07 13:31:45

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2971386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档