TMemoryStream如何完整保存wchar_t?

wsxqaz 2012-08-27 04:19:21
我想用TMemoryStream保存wchar_t所有数据然后发送给另一个程序,但是接收乱码,帮我看看这样写对不对?
wchat_t* w="测试"
int len=wcslen(w)
TMemoryStream* m=new TMemoryStream
m->Write(w,len); //我这里改成m->Write(&w,len);也是乱码,这里的size到底要不要*2?wchar_t占2位是不是要*2?
...全文
155 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsxqaz 2012-08-29
  • 打赏
  • 举报
回复
解决了WideCharToMultiByte将wchar_t*转成char*但是Page Code必须使用CP_UTF8
wirner 2012-08-27
  • 打赏
  • 举报
回复
len=wcslen(w) * sizeof(wchar_t).
ccrun.com 2012-08-27
  • 打赏
  • 举报
回复
wchar_t *w = L"测试";
int len = wcslen(w);
int size = len * 2;

TMemoryStream *m = new TMemoryStream;
m->SetSize(size);
m->Write(w, size);
...

// delete m;
__lhy 2012-08-27
  • 打赏
  • 举报
回复
int len=wcslen(w) 这个地方用错了
wcslen求的是wchar_t的字符串长度

如:wchar_t* wstr=L"你好";
int len=wcslen(wstr);//=2
但是实际占有空间为4字节,原因:wchar_t类型一个字符占2个字节。
缘中人 2012-08-27
  • 打赏
  • 举报
回复
[url=http://][/url]

Terry_Liu 的方法
(2)你可以用 BCB 執行以下測試程式碼 (利用 Win32 API MultiByteToWideChar 轉換 BIG5 成 UNICODE) char szBIG5[64]={0}; wchar_t wszUNICODE[64]={0}; lstrcpy(szBIG5, "簡"); TMemoryStream *ms1=new TMemoryStream; ms1->Size=64*sizeof(char); ms1->Write(szBIG5, ms1->Size); ms1->SaveToFile("test1.txt"); delete ms1; MultiByteToWideChar(CP_ACP, 0, szBIG5, -1, wszUNICODE, 64*sizeof(wchar_t)); TMemoryStream *ms2=new TMemoryStream; ms2->Size=64*sizeof(wchar_t); ms2->Write(wszUNICODE, ms2->Size); ms2->SaveToFile("test2.txt"); delete ms2;(3)執行完畢之後,會產生兩個檔案,其中檔案「test1.txt」就是「簡」字的 BIG5 編碼 (檔案內容的第 1~2 BYTE C2 B2,代表編碼為 0xB2C2);另外檔 案「test2.txt」就是「簡」字的 Unicode 編碼 (檔案內容的第 1~2 BYTE 21 7C,代表編碼為 0x7C21)(4)接著,就可以把編碼代入你原來的程式碼,看看結果如何? WideString ws; ws.SetLength(1); ws[1]=0x7C21; RichEdit1->Text=ws;(5)MSDN 參考說明文件 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_17si.asp

缘中人 2012-08-27
  • 打赏
  • 举报
回复
sizeof(wchar_t)*3

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧