【问题标题】:How do I properly port Win-only function GetMultiByteString?如何正确移植 Win-only 函数 GetMultiByteString?
【发布时间】:2011-03-21 07:03:38
【问题描述】:

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

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

【问题讨论】:

  • 如果“wchar”是指wchar_t,那么这是一个类型,而GetMultiByteString()似乎是一个函数(我不知道。顺便说一句)。由于您不能用类型替换函数,因此我必须在这里遗漏一些东西。也许您可以将这条信息添加到您的问题中?
  • @sbi:他说的可能是wcstombsmbstowcs
  • wchar 我指的是整个 wchar 库;当我回到那个项目时,我一定会看看 wcstombs 和 mbstowcs。

标签: c++ wchar


【解决方案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。

【讨论】:

  • 现在MultiByteToWideChar()WideCharToMultiByte() 到底是哪里来的? (问题是关于GetMultiByteString()。)
  • @sbi:GetMultiByteString 不是 Win32 函数。因此,我假设他说的是 API 中的两个多字节函数。
  • 我认为 GetMultiByteString 是一个仅限 Win32 的函数。这个问题可能适用于我在这个项目中遇到的任何多字节 Win32 函数。
  • @Alex:我从来没有听说过一个叫做GetMultiByteString的函数。 MSDN当然不知道。 Google 只返回这个问题。我发布的两个功能很可能是您的意思。如果没有,那么您将不得不在您的代码库中挖掘以找出该函数的来源。
猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
相关资源
最近更新 更多