我有一个严格使用 Unicode 函数和数据类型的 C++ Native WinAPI 应用程序。即 CreateWindowW()、SendMessageW()、wstring、WCHAR 等。现在我打算扩展我的应用程序以使用 SQLite3。
我的问题: SQLite3 库是 ANSI。这意味着我必须使用char*
大多数函数参数。
在 Unicode 应用程序中使用 ANSI 函数是否有任何限制或负面影响?
如果有这些影响可能是什么?
SQLite 不限于 ANSI。这是一种char*
暗示 ANSI 编码文本的误解。并非所有对数据进行操作的函数都char*
假定数据是 ANSI 编码的。对于 SQLite,它完全支持 Unicode,并使用char*
使用 UTF-8 编码的数据来实现。
如果您打算继续在应用程序内部使用 UTF-16 编码文本,则需要在代码和 SQLite 代码之间的边界处添加一个适配器层。将数据传递给 SQLite 时从 UTF-16 转换为 UTF-8,接收时则相反。
在我看来,这使您提出的问题有些没有实际意义,但无论如何我都会解决这个问题:
在 Unicode 应用程序中使用 ANSI 函数是否有任何限制或负面影响?
使用 ANSI 函数最明显的缺点是:
没有限制,您可以在 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
您可以在 Unicode 应用程序中使用基于 Ansi 的 API。只需在将输入的 Unicode 字符串传递给 API 时将其转换为 Ansi,并在从 API 返回时将任何输出的 Ansi 字符串转换为 Unicode。为此,您可以使用WideCharToMultiByte()
andMultiByteToWideChar()
或更高级别的包装器CString
,例如 ATL 转换等。