如何正确移植仅限 Win 的函数 GetMultiByteString?

发布于 2024-09-11 15:44:03 字数 246 浏览 6 评论 0原文

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

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

I'm porting code originally Windows-only to cross-platform friendly code; one particular stumbling block is trying to convert calls to the Windows Unicode function "GetMultiByteString" (and any related functions) to the more portable wchar-based functions. I'm having little success with it, as using wchar results in premature loop terminations when trying to iterate through Unicode strings.

What is the correct way to use wchar to replace GetMultiByteString and any other related Unicode functions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

鲸落 2024-09-18 15:44:07

您正在尝试将苹果变成橙子。 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 个字节。

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

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

或者:您必须使用图书馆,例如 ICU。

You're trying to convert apples into oranges here. MultiByteToWideChar and WideCharToMultiByte convert between specific encodings, UTF-16 <-> a variety of other encodings, including ANSI.

3 problems:

  1. The encoding to which the char <-> wchar_t functions in the C standard library operates is implementation defined. It could translate between UCS-2 and ASCII, or EBDIC, or any number of other codepages. You can't replace the windows functions with these because you can't assume wcstombs and mbstowcs actually are talking about UTF-16, or actually talking about ASCII. Usually the actual encoding they use is UTF-32 on unix boxes.
  2. Unix boxes don't often recognise UTF-16 -- they're all UTF-8 based, if they support unicode at all.
  3. wchar_t is typically 4 bytes on unix boxes, not 2 bytes, so you'd have to check all of your code to ensure that the size of it was never assumed to be 2 bytes.

Simply put, there is no completely portable way of dealing with these kind of things unless you write the code to do the encoding yourself.

If you want to be portable, you need to define a typedef or something so that your application uses wchar_t on windows, and char on everything else. You then must assume that UTF-16 is being used on Windows boxes, and UTF-8 is being used on unix boxes.

OR: You have to use a library, such as ICU.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文