如何使用wcstombs而不是WideCharToMultiByte?

时间:2012-05-25 10:15:51

标签: c++

wcstombs有三个参数。

WideCharToMultiByte有8个参数。

如何更换?

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

是否相同?

2 个答案:

答案 0 :(得分:3)

WideCharToMultiByte做的事情wcstombs差别很大,所以至少有些怀疑¹这种替代会成功。

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

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

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

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


¹大规模低调

答案 1 :(得分:0)

  • wcstombs转换为的结果编码取决于当前的区域设置,而WideCharToMultiByte可以明确指定代码页。
  • wcstombs转换为“宽字符串”,其编码取决于标准库的实现。 WideCharToMultiByte转换为UTF-16中的字符串。宽字符wcstombs依赖可能不是以UTF-16编码,但在Windows宽字符中是UTF-16。
  • wcstombs是可移植的,WideCharToMultiByte不可移植。如果您的目标平台仅适用于Windows,则无关紧要。
  • WideCharToMultiByte允许指定一个“默认字符”,用于代替无法在目标编码中表示的字符。

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

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

相关问题