【问题标题】:How to use wcstombs instead of WideCharToMultiByte ?如何使用 wcstombs 代替 WideCharToMultiByte ?
【发布时间】:2012-05-25 10:15:50
【问题描述】:

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)

一样吗?

【问题讨论】:

  • 不是一回事,你不能用 wcstombs() 指定语言环境或代码页,你只能得到默认语言环境。你真正想做什么?
  • 也许我的this question 对你有些兴趣。
  • WideCharToMultiByte 代码在 PC 上运行。然后我想在Mac上运行代码,所以我需要删除WideCharToMultiByte,因为它不能在Mac上运行。
  • @cuichang: 单行不可能做到这一点。

标签: c++


【解决方案1】:

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

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

换句话说:WCTMB 从一种已知编码转换为另一种已知编码。 wcstombs 从未知编码转换为另一种未知编码。前者不能换成后者,尤其是要转成中文编码(不就是936吗?)。

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

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


¹ 严重的轻描淡写

【讨论】:

    【解决方案2】:
    • wcstombs 转换为的结果编码取决于当前语言环境,而 WideCharToMultiByte 可以显式指定代码页。
    • wcstombs 从“宽字符串”转换而来,其编码取决于标准库的实现。 WideCharToMultiByte 从 UTF-16 字符串转换而来。 wcstombs 依赖的宽字符可能不是以 UTF-16 编码的,但在 Windows 中,宽字符是 UTF-16。
    • wcstombs 是可移植的,WideCharToMultiByte 不是。如果您的目标平台仅为 Windows,则没关系。
    • WideCharToMultiByte 允许指定一个“默认字符”来代替目标编码中无法表示的字符。

    所以WideCharToMultiByte 更强大,可能用作wcstombs 的后端。

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

    【讨论】:

    • @cuichang 必须的。试试吧!
    • wcstombs(kkburr, szBn, ccBn)。它要求宽字符串szBn 以零结尾,目标字符串szBn 至少为ccBn+1 字节长。
    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2011-03-23
    • 2011-06-10
    • 2011-01-17
    相关资源
    最近更新 更多