如何使用wcstombs而不是WideCharToMultiByte ?

How to use wcstombs instead of WideCharToMultiByte ?

本文关键字:WideCharToMultiByte 何使用 wcstombs      更新时间:2023-10-16

wcstombs有三个参数。

WideCharToMultiByte有八个参数,

如何更换?

wcstombs怎么写这样:

int kk = WideCharToMultiByte(936, 0, szBn, ccBn+1, 0, 0, 0, 0);

wcstombs怎么写这样:

int kk= WideCharToMultiByte(936,
                            0,
                            szBn,
                            ccBn+1,
                            kkburr,
                            (ccBn+1)*sizeof(wchar_t),
                            0,
                            0)

一样吗?

WideCharToMultiByte做一些与wcstombs有很大不同的事情,所以这种替换是否会成功至少有点值得怀疑¹。

具体来说,WCTMB 从 UTF-16 转换为您选择的另一个字符集(和编码)。 wcstombs从"宽字符串"转换为"多字节字符串",但标准将这些术语的确切定义留给实现者。

换句话说:WCTMB 从已知编码转换为另一种已知编码。 wcstombs从未知编码转换为另一种未知编码。您不能用后者替换前者,特别是如果您想转换为中文编码(这不是 936 吗?

寻求进行此替换的原因是什么?无论它是什么,几乎可以肯定有更合适的方法来实现目标。

更新:如果您想要一个独立于平台的可靠解决方案,那么我建议您使用 ICU。不要指望找到WCTMB的单行替代品,因为它根本不存在。


¹ 极度轻描淡写

  • wcstombs转换为的结果编码取决于当前区域设置,而WideCharToMultiByte可以显式为其指定代码页。
  • wcstombs从"宽字符串"转换,其编码取决于标准库的实现。 WideCharToMultiByte从 UTF-16 格式的字符串转换。宽字符wcstombs依赖的字符可能不以 UTF-16 编码,但在 Windows 中宽字符为 UTF-16。
  • wcstombs是便携式的,WideCharToMultiByte不是。如果您的目标平台只是Windows,那么这并不重要。
  • WideCharToMultiByte允许指定一个"默认字符",该字符将被使用,而不是无法在目标编码中表示的字符。

因此,WideCharToMultiByte功能强大得多,可能用作wcstombs的后端。

如果您当前的代码页不是 936,那么您询问的替换是不可能的。

相关文章:
  • 没有找到相关文章