我有一个严格使用Unicode函数和数据类型的C ++ Native WinAPI应用程序。即,CreateWindowW(),SendMessageW(),wstring,WCHAR等。现在我打算扩展我的应用程序以使用SQLite3。
我的问题: SQLite3库是ANSI。这意味着我必须使用char*
作为大多数函数参数。
在Unicode应用程序中使用ANSI函数是否有任何限制或负面影响?
如果有这些影响可能会发生什么?
答案 0 :(得分:4)
SQLite不限于ANSI。这是一种误解,char*
暗示ANSI编码的文本。并非所有对char*
数据进行操作的函数都假定数据是ANSI编码的。在SQLite的情况下,它完全支持Unicode,并使用使用UTF-8编码的char*
数据。
如果您打算继续在应用程序内部使用UTF-16编码文本,则需要在代码和SQLite代码之间的边界添加适配器层。在将数据传递给SQLite时从UTF-16转换为UTF-8,在接收时将其转换为相反的方向。
我想到的是,你提出的问题有点没有实际意义,但无论如何我都要解决这个问题:
在Unicode应用程序中使用ANSI函数是否存在任何限制或负面影响?
使用ANSI函数最明显的缺点是:
答案 1 :(得分: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
实际上是宏,在ANSI配置中扩展为SetWindowTextA
,在Unicode配置中扩展为SetWindowTextW
。
任何非通用字符串或API名称(如char*
,SetWindowTextW
等)在任何程序配置中都以相同的方式工作。
使用ATL转换宏在不同(通用和非通用)字符串类型之间进行转换:http://msdn.microsoft.com/en-us/library/87zae4a3%28v=vs.80%29.aspx
答案 2 :(得分:0)
您可以在Unicode应用程序中使用基于Ansi的API。只需将输入的Unicode字符串转换为Ansi,然后将它们传递给API,并在从API返回时将任何输出的Ansi字符串转换为Unicode。您可以使用WideCharToMultiByte()
和MultiByteToWideChar()
或更高级别的包装,例如CString
,ATL转换等。