如何正确移植Win-only函数GetMultiByteString?

时间:2010-07-26 20:03:31

标签: c++ wchar

我最初将Windows代码移植到跨平台友好代码中;一个特殊的绊脚石试图将对Windows Unicode函数“GetMultiByteString”(和任何相关函数)的调用转换为更易于移植的基于wchar的函数。我没有成功,因为在尝试迭代Unicode字符串时,使用wchar会导致过早的循环终止。

使用wchar替换GetMultiByteString和任何其他相关Unicode函数的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

你想在这里把苹果变成橙子。 MultiByteToWideChar和WideCharToMultiByte在特定编码之间进行转换,UTF-16< - >各种其他编码,包括ANSI。

3个问题:

  1. char< - >的编码。 C标准库中的wchar_t函数操作是实现定义的。它可以在UCS-2和ASCII,或EBDIC或任何数量的其他代码页之间进行转换。你不能用这些替换windows函数,因为你不能假设wcstombs和mbstowcs实际上是在讨论UTF-16,或者实际上是在谈论ASCII。通常他们使用的实际编码是unix盒子上的UTF-32。
  2. Unix盒子通常不会识别UTF-16 - 如果它们完全支持unicode,它们都是基于UTF-8的。
  3. wchar_t在unix框上通常为4个字节,而不是2个字节,因此您必须检查所有代码以确保其大小从未假设为2个字节。
  4. 简单地说,除非你自己编写代码进行编码,否则没有完全可移植的方式来处理这些事情。

    如果你想要可移植,你需要定义一个typedef或类似的东西,以便你的应用程序在windows上使用wchar_t,并在其他所有内容上使用char。然后你必须假设在Windows机箱上使用UTF-16,并且在unix机箱上使用UTF-8。

    或者:您必须使用库,例如​​ICU。