2

wcstombs有三个参数。

WideCharToMultiByte有八个args,</p>

如何更换?</p>

如何使用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)

一样吗?

4

2 回答 2

3

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

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

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

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

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


¹ 大量轻描淡写

于 2012-05-25T10:20:37.567 回答
0
  • 转换为的结果编码wcstombs取决于当前的语言环境,而WideCharToMultiByte可以显式地给出一个代码页。
  • wcstombs从“宽字符串”转换而来,其编码取决于标准库的实现。WideCharToMultiByte从 UTF-16 中的字符串转换。wcstombs所依赖的宽字符可能不会以 UTF-16 编码,但在 Windows 中,宽字符是 UTF-16。
  • wcstombs是便携的,WideCharToMultiByte不是。如果您的目标平台仅是 Windows,那没关系。
  • WideCharToMultiByte允许指定将使用的“默认字符”,而不是无法在目标编码中表示的字符。

SoWideCharToMultiByte功能更强大,可能用作wcstombs.

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

于 2012-05-25T10:24:03.677 回答