2

在我目前的项目中,我一直在使用宽字符(utf16)。但是由于我唯一的用户输入将是一个 url,无论如何它必须以 ascii 结尾,以及另一个字符串,我正在考虑将整个程序切换为 ascii。

我的问题是,在将字符串传递给 Windows API 函数之前将它们转换为 utf16 有什么好处吗?

在网上做了一些研究之后,如果你不在 Windows 上使用 UTF-16,似乎很多人推荐这个。

4

2 回答 2

5

在 Windows API 中,如果您调用类似的函数

int SomeFunctionA(const char*);

然后它会自动将字符串转换为 UTF-16 并调用函数的真实Unicode 版本:

int SomeFunctionW(const wchar_t*);

问题是,它将字符串从 ANSI code page转换为 UTF-16 。如果您实际上有在 ANSI 代码页中编码的字符串,那就可以了。如果您有以 UTF-8 编码的字符串(例如,近 70% 的 Web 页面)现在越来越普遍,并且不支持作为 ANSI 代码页,则它不起作用。

此外,如果您使用AAPI,您将遇到限制,例如无法(轻松)打开名称中包含非 ANSI 字符(可以是任意 UTF-16 字符串)的文件。并且无法访问某些 Windows 的新功能

这就是为什么我总是调用W函数。即使这意味着烦人的显式转换(来自我们软件的非 Windows 特定部分中使用的 UTF-8 字符串)。

于 2012-04-18T05:25:06.700 回答
4

要点是,在 Windows 上,UTF-16 是本机编码,所有以 API 函数结尾的函数A只是它们W的包装器。这些A功能只是为了与为 Windows 9x/ME 编写的程序兼容而随身携带,事实上,任何新程序都不应该使用它们(在我看来)。

除非您正在对数十亿个大字符串进行大量处理,否则我怀疑考虑将它们存储在另一种(可能更节省空间)编码中是否有任何好处。此外,如果您考虑 IDN,即使 URI 也可以包含 Unicode。因此,不要太确定您的用户将传递给程序的数据。

于 2012-04-18T05:06:56.753 回答