在将ASCIIstring传递给Windows API函数之前将其转换为UTF-16

在我目前的项目中,我一直在使用宽字符(utf16)。 但是因为我唯一的用户input将是一个URL,反正最后还是一个string,另外一个string,我只想把整个程序切换到ascii。

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

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

主要的一点是,在Windows上,UTF-16是本地编码,所有以A结尾的API函数都只是W的包装器。 A函数只是作为与Windows 9x / ME编写的程序的兼容性来实现的,事实上,没有新的程序应该使用它们(在我看来)。

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

在Windows API中,如果您调用类似的功能

 int SomeFunctionA(const char*); 

那么它会自动将字符串转换为UTF-16,并调用真正的 Unicode版本的函数:

 int SomeFunctionW(const wchar_t*); 

catch是,它将字符串转换为UTF-16 从ANSI代码页 。 如果你实际上有在ANSI代码页中编码的字符串,那工作OK。 如果你使用UTF-8编码的字符串(如今已经越来越普遍)(例如近70%的网页 ),并且不支持ANSI代码页,那么这种方法是行不通的。

另外,如果您使用A API,则会遇到诸如不能(很容易地)打开其名称中具有非ANSI字符(可以是任意UTF-16字符串)的文件的限制。 而且将无法访问Windows的一些新功能 。

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