如果仅字节大小已知,将UTF-16缓冲区转换为CString?

时间:2018-10-30 03:14:33

标签: string mfc

https://www.sqlite.org/c3ref/column_blob.html中使用sqlite3_column_text16和sqlite3_column_bytes16时,我只能得到一个指向UTF-16文本缓冲区的指针以及该缓冲区中的字节数。

现在我需要将这样的缓冲区转换为CString对象。怎么做?看来CString仅具有以下构造函数:

CString( LPCTSTR lpch, int nLength );  // requires LPCTSTR and number of chars, not bytes
CString( LPCWSTR lpsz );               // requires null-terminiated Unicode buffer

两者似乎都不适合我的情况。

1 个答案:

答案 0 :(得分:0)

CString( LPCTSTR lpch, int nLength )将完成工作。它仅需要LPCTSTR强制转换,在这种情况下只需LPCWSTRnLength的大小应除以2以说明wchar_t

如果您的程序不是Unicode,请使用CStringW

示例:

//create a buffer (buf) and copy a wide string in to it
const wchar_t *source = L"ABC";
int len = wcslen(source);
int bytesize = len * 2;

BYTE *buf = new BYTE[bytesize + 2]; //optional +2 for null terminator
memcpy(buf, source, bytesize);

//copy buf into destination CString
CString destination((LPCWSTR)buf, bytesize / 2);
delete[]buf;

MessageBoxW(0, destination, 0, 0);

bufbytesize来自数据库,因此只需输入:

CString destination((LPCWSTR)buf, bytesize / 2);    
//or
CStringW destination((LPCWSTR)buf, bytesize / 2);