【问题标题】:Writing unicode C++ source code编写 unicode C++ 源代码
【发布时间】:2013-06-17 11:03:06
【问题描述】:

我在 Visual Studio 2012 的项目属性中看到您可以为您的应用程序选择字符集。

我使用 Unicode 字符集。 多字节字符集有什么问题?或者更好,我为什么要使用 Unicode?​​p>

以我正在做的 DLL 中的这段代码为例

RECORD_API int startRecording(
   char *cam_name,      // Friendly video device name
   char *time,          // Max time for recording
   char *f_width,       // Frame width
   char *f_height,      // Frame height
   char *file_path)     // Complete output file path
{
  ...
}

Windows.h 头文件中的许多 Unicode 函数使用 wchar_t 参数;我应该将 wchar_t 也用于我的函数参数吗?

我是否应该始终显式显示 W 函数(例如:ShellExecuteW)?

【问题讨论】:

标签: c++ visual-studio unicode internationalization


【解决方案1】:

首先,不管界面说什么,问题不是 Unicode 与否,但 UTF-16 或 UTF-8。实际上,对于 外部数据,您应该只使用 UTF-8。在内部,它 取决于你在做什么。 UTF-8 到 UTF-16 的转换是 一个额外的复杂性,但对于更复杂的操作,它可能 更容易在 UTF-16 中工作。 (虽然两者之间的差异 UTF-8 和 UTF-16 并不庞大。为了获得任何真正的好处, 你必须使用 UTF-32,即使那样......)

在实践中,我会完全避免使用 W 函数,并且 始终在系统接口级别使用char const*。但 再次,这取决于你在做什么。这只是一般 指导方针。其余的,我会坚持使用std::string 除非 有一些强有力的理由不这样做。

【讨论】:

  • 很遗憾,A 函数不支持 UTF-8,因此如果您想要正确的 Unicode 支持,您必须调用 W 函数。
  • @dan04 很有趣,因为我一直使用 UTF-8 的 A 函数。
  • Win32 API A 函数绝对不支持 UTF-8。您可以在char* 参数中传递 UTF-8 数据,但API 不会解释 UTF-8 这样的数据。仅 ASCII 字符串将起作用,因为 UTF-8 与 ASCII 兼容,但非 ASCII 字符需要额外的处理,而 API 根本不会对 char* 数据进行处理。大多数A 函数只是委托给W 函数,根据需要在内部使用MultiByteToWideChar()WideCharToMultiByte(),但使用的代码页是控制面板中配置的操作系统默认Ansi 代码页,而不是用户在代码中定义的代码页。
  • @JamesKanze: 一个A函数使用MultiByteToWideChar(CP_ACP)char输入数据转换为wchar_t,然后调用对应的W函数,然后将wchar_t输出数据转换为@987654338 @使用WideCharToMultiByte(CP_ACP)。如果输入包含未编码为 CP_ACP(包括 UTF-8)的非 ASCII 字符,它们将在转换过程中丢失/损坏。无论如何,任何输出都不会被编码为 UTF-8。所以请勿将 UTF-8 非 ASCII 数据传递给 A 函数,除非您不关心数据丢失。
  • @JamesKanze: WriteFile() 没有AW 变体,因为它对原始二进制数据而不是文本数据进行操作。我所描述的一切都适用于基于文本的 API 函数,它们实际上确实有 AW 变体。顺便说一句,文件名和路径 CAN 中包含非 ASCII 字符。见过日本用户的文件系统吗?我有。他们喜欢在文件夹/文件名中使用非 ASCII Unicode 字符,而且效果很好。
【解决方案2】:

您不需要显式调用函数的..W 版本,因为它应该已经包含在包含文件和您使用的设置中。因此,如果您针对 Unicode 支持进行编译,则将使用您的系统调用的 W 版本,否则将使用 A

如果你真的可以测试它,我个人只会为 Unicode 编译。至少你不应该仅仅因为你为它编译就认为你的应用程序在所有情况下都可以正常工作。对其进行编译只是第一步,但当然,您必须因此使用适当的类型并测试您的代码,以确保没有您可能没有注意到的效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2022-11-20
    • 2015-04-27
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多