0

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

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

4

1 回答 1

1

你正试图在这里把苹果变成橘子。MultiByteToWideChar 和 WideCharToMultiByte 在特定编码、UTF-16 <-> 各种其他编码之间转换,包括 ANSI。

3个问题:

  1. C 标准库中的 char <-> wchar_t 函数操作的编码是实现定义的。它可以在 UCS-2 和 ASCII、EBDIC 或任何数量的其他代码页之间进行转换。您不能用这些替换 windows 函数,因为您不能假设 wcstombs 和 mbstowcs 实际上是在谈论 UTF-16,或者实际上是在谈论 ASCII。通常他们使用的实际编码是 UTF-32 在 unix 盒子上。
  2. Unix 机器通常不识别 UTF-16——如果它们完全支持 unicode,它们都是基于 UTF-8 的。
  3. wchar_t在 unix 盒子上通常是 4 个字节,而不是 2 个字节,因此您必须检查所有代码以确保它的大小从未被假定为 2 个字节。

简而言之,除非您自己编写代码来进行编码,否则没有完全可移植的方式来处理这类事情。

如果你想便携,你需要定义一个 typedef 或其他东西,以便你的应用程序在 windows 上使用 wchar_t,在其他所有东西上使用 char。然后,您必须假设 UTF-16 正在 Windows 机器上使用,而 UTF-8 正在 unix 机器上使用。

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

于 2010-07-26T20:13:25.907 回答