【发布时间】:2014-01-13 08:54:33
【问题描述】:
我有一个没有 MFC 支持的 MS VC++ 程序。 (这就是使用 std::wstring 而不是 CString 的原因。)
我正在使用这种方法将数据流式传输到 Richedit:
DWORD __stdcall MEditStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
std::wstring *wsBuffer = (std::wstring *)dwCookie;
cb = wsBuffer->length();
for (int i = 0; i < cb; i++)
*(pbBuff+i) = wsBuffer->c_str()[i];
*pcb = cb;
return 0;
}
它以某种方式工作,但我不喜欢使用 for 循环手动转换字符的方式。
有什么函数可以更有效地执行这种转换吗?
【问题讨论】:
-
你的循环看起来不错。请务必了解您没有更改编码 - 您只需将字符串复制为字节数组。你也可以写
(LPBYTE pbBuff = (LPBYTE)&wsBuffer[0]; -
我正在将宽字符字符串复制到字节数组中。所以上面的类型转换不起作用。 )-:
-
您可以使用
WideCharToMultiByte并将宽字符串正确转换为适当的编码。 -
几乎没有任何只支持多字节的 API。在过去 20 年左右的时间里,UTF-16 一直是 Microsoft Windows 的标准。我强烈怀疑你可以只使用 Unicode 版本而忽略所有这些字符转换废话。
-
@NotAnAdmin 你是对的 ;-) 然而在类型转换之后,你得到了一个指向你的
wsBuffer的指针,就像LPBYTE一样。您可以使用任何您喜欢的方式复制它。wsBuffer.size()以 2 字节为单位提供长度。
标签: c++