如何将Unicode字符串转换为utf-8或utf-16字符串?我的VS2005项目使用Unicode字符集,而cppite中的sqlite提供
int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open16( const void *filename, /* Database filename (UTF-16) */ sqlite3 **ppDb /* OUT: SQLite db handle */ );
用于打开文件夹.如何将字符串,CString或wstring转换为UTF-8或UTF-16字符集?
非常感谢!
使用WideCharToMultiByte函数.指定CP_UTF8
的CodePage
参数.
CHAR buf[256]; // or whatever WideCharToMultiByte( CP_UTF8, 0, StringToConvert, // the string you have -1, // length of the string - set -1 to indicate it is null terminated buf, // output __countof(buf), // size of the buffer in bytes - if you leave it zero the return value is the length required for the output buffer NULL, NULL );
此外,Windows中unicode应用程序的默认编码是UTF-16LE,因此您可能不需要执行任何转换,只需使用第二个版本sqlite3_open16
.
简短回答:
如果使用CString或wstring等Unicode字符串,则无需转换.使用sqlite3_open16().你必须确保传递一个WCHAR指针(已经转换为void *
.看起来很蹩脚!即使这个lib是跨平台的,我猜他们可能已经定义了一个宽的char类型,它取决于平台并且不比a更不友好void *
). API.比如CString:(void*)(LPCWSTR)strFilename
答案越长:
您没有要转换为UTF8或UTF16的Unicode字符串.您在程序中使用给定的编码表示Unicode字符串:Unicode本身不是二进制表示形式.编码说明Unicode代码点(数值)如何在内存中表示(数字的二进制布局).UTF8和UTF16是使用最广泛的编码.但它们非常不同.
当一个VS项目说"Unicode charset"时,它实际上意味着"字符被编码为UTF16".因此,您可以直接使用sqlite3_open16().无需转换.字符存储在WCHAR类型(相对于char
)中,占用16位(标准C类型的回退wchar_t
,在Win32上占16位.在其他平台上可能会有所不同.感谢校正,Checkers).
还有一个您可能需要注意的细节:UTF16有两种版本:Big Endian和Little Endian.这是这16位的字节顺序.您为UTF16提供的函数原型并未说明使用了哪种排序.但是你很安全,假设sqlite使用与Windows相同的字节序(Little Endian IIRC.我知道顺序,但一直有名字的问题:-)).
编辑:回答Checkers的评论:
UTF16使用16位代码单元.在Win32下(仅在Win32上),wchar_t
用于此类存储单元.诀窍是一些Unicode字符需要2个这样的16位代码单元的序列.他们被称为代理对.
UTF8使用1到4个字节序列表示1个字符的方式相同.然而,UTF8与该char
类型一起使用.