繁体   English   中英

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

[英]How do I write a std::codecvt facet?

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

跨平台是首选,但 Windows 上的 MSVC 也很好。 是否有关于如何正确使用此类的任何类型的教程或任何此类性质的内容?

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

享受

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

重要通知

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

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

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

...这就是为什么没有人使用 std::codecvt 的原因。 我建议你做其他人都做的事情,假装它从未发生过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM