简短回答:
No conversion required if you use Unicode strings such as CString or wstring. Use sqlite3_open16().
You will have to make sure you pass a WCHAR pointer (casted to void *
. Seems lame! Even if this lib is cross platform, I guess they could have defined a wide char type that depends on the platform and is less unfriendly than a void *
) to the API. Such as for a CString: (void*)(LPCWSTR)strFilename
更长的答案:
你没有一个想要转换为UTF8或UTF16的Unicode字符串。你的程序中有一个使用给定编码表示的Unicode字符串:Unicode本身并不是二进制表示。编码表述Unicode代码点(数值)在内存中的表示方式(数字的二进制布局)。UTF8和UTF16是最常用的编码方式,但它们也有很大的不同。
当一个VS项目说“Unicode字符集”时,它实际上是指“字符编码为UTF16”。因此,您可以直接使用sqlite3_open16()。不需要转换。字符存储在WCHAR类型中(与char
相对),它占用16位(在Win32上回退到标准C类型wchar_t
,可能在其他平台上有所不同。感谢Checkers的更正)。
还有一个细节需要注意:UTF16存在两种格式:Big Endian和Little Endian。这是16位字节的排序方式。你给出的UTF16函数原型没有说明使用哪种排序方式。但是你可以放心地认为sqlite使用与Windows相同的Endian-ness(我记得是Little Endian,我知道顺序但一直有问题命名:-))。
编辑:给Checkers评论的回复:
UTF16使用16位代码单元。在Win32下(并且仅仅在Win32下),wchar_t
被用来作为这种存储单元。技巧是有些Unicode字符需要由两个这样的16位代码单元序列组成,它们被称为代理对。
同样的方式,UTF8使用1到4个字节序列来表示1个字符。然而,UTF8与char
类型一起使用。