在Unicode应用程序中使用ANSI函数是否有任何限制

时间:2013-06-09 10:57:50

标签: c++ winapi unicode sqlite

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

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

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

如果有这些影响可能会发生什么?

3 个答案:

答案 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. 严格限制字符集。
  2. 在不同字符集之间进行转换时的性能成本。
  3. 由于在单个代码库中使用多个字符集而导致程序员混淆和错误的风险。

答案 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转换等。