0

我有一个严格使用 Unicode 函数和数据类型的 C++ Native WinAPI 应用程序。即 CreateWindowW()、SendMessageW()、wstring、WCHAR 等。现在我打算扩展我的应用程序以使用 SQLite3。

我的问题: SQLite3 库是 ANSI。这意味着我必须使用char*大多数函数参数。

在 Unicode 应用程序中使用 ANSI 函数是否有任何限制或负面影响?

如果有这些影响可能是什么?

4

3 回答 3

4

SQLite 不限于 ANSI。这是一种char*暗示 ANSI 编码文本的误解。并非所有对数据进行操作的函数都char*假定数据是 ANSI 编码的。对于 SQLite,它完全支持 Unicode,并使用char*使用 UTF-8 编码的数据来实现。

如果您打算继续在应用程序内部使用 UTF-16 编码文本,则需要在代码和 SQLite 代码之间的边界处添加一个适配器层。将数据传递给 SQLite 时从 UTF-16 转换为 UTF-8,接收时则相反。

在我看来,这使您提出的问题有些没有实际意义,但无论如何我都会解决这个问题:

在 Unicode 应用程序中使用 ANSI 函数是否有任何限制或负面影响?

使用 ANSI 函数最明显的缺点是:

  1. 严格限制的字符集。
  2. 在不同字符集之间转换时的性能成本。
  3. 由于在单个代码库中使用多个字符集而导致程序员混淆和错误的风险。
于 2013-06-09T22:31:57.407 回答
1

没有限制,您可以在 Unicode 应用程序中使用 ANSI 字符串。

一些细节: Unicode 应用程序是编译时定义的。在运行时,程序可以使用 Unicode 和 ANSI 字符串。

例如:

char* ptr1;     // this is always ANSI string
wchar_t* ptr2;  // this is always Unicode string
TCHAR* ptr3;    // this is generic string, which is compiled as char* or wchar_t*

Unicode/ANSI 配置因解释通用文本宏而不同,例如TCHAR. 一些 Windows API 也使用通用文本宏实现。例如:SetWindowText实际上是宏,SetWindowTextA在 ANSI 配置中扩展为,SetWindowTextW在 Unicode 配置中扩展为。

任何非通用字符串或 API 名称(如char*SetWindowTextW)在任何程序配置中都以相同的方式工作。

使用 ATL 转换宏在不同(通用和非通用)字符串类型之间进行转换:http: //msdn.microsoft.com/en-us/library/87zae4a3%28v=vs.80%29.aspx

于 2013-06-09T11:00:58.117 回答
0

您可以在 Unicode 应用程序中使用基于 Ansi 的 API。只需在将输入的 Unicode 字符串传递给 API 时将其转换为 Ansi,并在从 API 返回时将任何输出的 Ansi 字符串转换为 Unicode。为此,您可以使用WideCharToMultiByte()andMultiByteToWideChar()或更高级别的包装器CString,例如 ATL 转换等。

于 2013-06-09T20:44:04.080 回答