c++ - 在将 ASCII 字符串传递给 Windows API 函数之前将它们转换为 UTF-16

标签 c++ windows winapi unicode encoding

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

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

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

最佳答案

在 Windows API 中,如果你调用像这样的函数

int SomeFunctionA(const char*);

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

int SomeFunctionW(const wchar_t*);

问题是,它将字符串转换为 UTF-16 从 ANSI 代码页。如果您实际上有在 ANSI 代码页中编码的字符串,那么它就可以正常工作。如果您有以 UTF-8 编码的字符串,这将不起作用,这在当今越来越普遍(例如 nearly 70% of Web pages ),并且不支持作为 ANSI 代码页。

此外,如果您使用 A API,您将遇到一些限制,比如无法(轻松地)打开名称中包含非 ANSI 字符(可以是任意 UTF)的文件-16 弦)。并且无法访问某些 Windows 的 newer features

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

关于c++ - 在将 ASCII 字符串传递给 Windows API 函数之前将它们转换为 UTF-16,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10202969/

相关文章:

c - 分隔空字节分隔的 UNICODE C 字符串

c++ - compare_exchange_weak() 编译错误?

c++ - 使用 BOOST shared_array 而不是 shared_ptr 的好处

c++ - 为什么 C++ 哈希函数的返回类型是 std::size_t,而不是平台无关类型?

c++ - 无法从 glGetShaderInfoLog 检索错误消息

windows - 调用Thread.Abort时finally不执行

linux - 需要一个 UI 工具来比较来自 Windows 服务器的 2 个 Linux 文件夹

c++ - 有没有办法不延迟地播放声音?

c - winapi CreateWindowEx -> 使用用户系统样式创建按钮?

c - 让弹出菜单显示/创建对话框? Windows32编程