在 vc++ 中将 Unicode 字节数组转换为 CString
Posted
技术标签:
【中文标题】在 vc++ 中将 Unicode 字节数组转换为 CString【英文标题】:Convert Unicode byte array to CString in vc++ 【发布时间】:2013-10-04 14:30:03 【问题描述】:我有一个大小为 2 的字节数组,其中包含来自基本多语言平面的单个 UTF-16LE 编码的 Unicode 字符。
BYTE b[2];
memset(b,0,2);
b[0] = 0x31;
b[1] = 0x00; //In future this byte contain info when unicode use , but now 0x00.
现在我想将其存储在 CString
或 TCHAR
中。
编辑
我确实用过
TCHAR tch = (TCHAR)b; //tch = 'X'
这怎么可能?
【问题讨论】:
专业提示:BYTE b[2] = ;
也同样有效,但噪音更小,更容易打字,而且比memset
安全得多。
试试CString szString((TCHAR*)b);
@RogerRowland CString szString((TCHAR*)b);
仅在 a) TCHAR
是 char
(即在非 Unicode 版本中)和 b) b[1] == 0
时有效。只要其中任何一个条件为假,您就会尝试从指向非 NUL 终止的缓冲区的指针构造一个字符串。
(TCHAR)b
并不像您认为的那样做。 b
是一个指针(指向数组的第一个元素)。 (TCHAR)b
有效地提取了所指向地址的低位字节。您的数组恰好位于 xxxxxx58 形式的地址,因此低位字节为 0x58 aka 'X'
。
@IgorTandetnik 是的,关于空终止符的好点 - 我错过了。
【参考方案1】:
您似乎在说您的 BYTE[2]
数组包含一个以 UTF-16(或 UCS-2 - 它们与基本平面等效)表示的单个 Unicode 代码点(来自基本平面)。在这种情况下,您可以这样构造一个单字符的CString
:
CStringW s((wchar_t*)b, 1);
或
CStringW s((wchar_t&)b);
不清楚您为什么一开始就使用BYTE[2]
而不是wchar_t
或WCHAR
。
【讨论】:
【参考方案2】:简单地说:
BYTE recv_buffer[1024];
CString str_recv(recv_buffer);
【讨论】:
【参考方案3】:我无法让上面建议的铸造方法起作用(VS 2015 in 2016)。这是我从真正了解 MFC 的已故 Scott McPhillips 那里学到的技术:
CString str;
LPWSTR strBuf = str.GetBufferSetLength( 4 ); // your b two bytes plus unicode trailing null
::memset( strBuf, 0, 4 ); // make sure the trailing bytes are null
::memcpy_s( strBuf, 2, b, 2 ); // copy over your byte bytes
str.ReleaseBuffer();
【讨论】:
以上是关于在 vc++ 中将 Unicode 字节数组转换为 CString的主要内容,如果未能解决你的问题,请参考以下文章