String 乱码问题怎么解决?

cankoo 2011-09-21 05:00:16
AnsiString不会有乱码(但不能移植),UNICODE版本的会有乱码。
测试程序:

//---------------------------------------------------------------------------
void __fastcall TForm4::Button4Click(TObject *Sender)
{
AnsiString ansistr = "ansi string kk大厦大厦大厦大厦大厦kkkkkkkkkk";
String str = L"unicode string 大厦大厦大厦大厦大厦kkkkkkkkkkkk";
Memo1->Lines->Add(ansistr);
Memo1->Lines->Add(str);
ansistr.c_str();
str.w_str();
Memo1->Lines->Add(ansistr);
Memo1->Lines->Add(str + ansistr);
MessageBoxA(Handle,str.t_str(),"ok",0);
MessageBoxW(Handle,str.w_str(),L"ok",0);
str = ansistr;
MessageBoxA(Handle,str.t_str(),"ok",0);
str = AnsiString(str);
MessageBoxA(Handle,str.t_str(),"ok",0);
}
//---------------------------------------------------------------------------

...全文
319 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cankoo 2011-09-22
  • 打赏
  • 举报
回复
ccrun.com 2011-09-21
  • 打赏
  • 举报
回复
TEXT("ok") 这个,如果_TCHAR映射为char *,则相当于"ok", 如果_TCHAR映射为wchar_t *,则相当于L"ok", 这就是和L"ok"的区别。

加个String()只是强制将AnsiString的对象转换成String类型而已。
cankoo 2011-09-21
  • 打赏
  • 举报
回复
MssageBox/MessageBoxA/MessageBoxW我只是拿他来做一个例子,太多的API需要字符串了。然而又不能把String 值直接给它。.t_str(),.c_str,.w_str实属无奈之举。我的目标就是使用UNCODESTRING,CHAR*,不会出现乱码。
我试了一下,使用wchar后确实不会有乱码了。

String str = L"unicode string 大厦大厦大厦大厦大厦kkkkkkkkkkkk";
MessageBox(Handle, str.t_str(), TEXT("ok"), 0);
MessageBoxA(Handle, AnsiString(str).c_str(), "ok", 0);
MessageBoxW(Handle, String(str).c_str(), L"ok", 0);//TEXT("ok") 跟L有啥区别?加个String()算什么?

AnsiString ansistr = "ansi string kk大厦大厦大厦大厦大厦kkkkkkkkkk";//不想使用它了,老版本用它的。
MessageBox(Handle, String(ansistr).t_str(), TEXT("ok"), 0);
MessageBoxA(Handle, ansistr.c_str(), "ok", 0);
MessageBoxW(Handle, String(ansistr).c_str(), L"ok", 0);


ccrun.com 2011-09-21
  • 打赏
  • 举报
回复
以上代码只适应2009/2010环境,在XE/XE2中,String类的.t_str()方法始终返回wchar_t *类型。
ccrun.com 2011-09-21
  • 打赏
  • 举报
回复
先复制一个以前我的回复:

String在C++Builder2010中,有三个函数将其转化成字符串,并且根据工程选项中对_TCHAR宏映射定义的不同,略有差异(注意.t_str的方法在XE2中已经固定返回wchar_t *了):

方法      _TCHAR映射为char  _TCHAR映射为wchar_t
-----------------------------------------------------
.c_str() 返回wchar_t * 返回wchar_t *
.w_str() 返回wchar_t * 返回wchar_t *
.t_str() 返回char * 返回wchar_t *


从上面的表中可以看出,.t_str()类似TCHAR宏,可以根据编译条件的不同,分别对应不同的数据类型。

所以在2010中,关于MssageBox/MessageBoxA/MessageBoxW的使用,我提供一个例子,可以最大程度的保证不乱码,并且不受工程选项中_TCHAR映射的影响:

String str = L"unicode string 大厦大厦大厦大厦大厦kkkkkkkkkkkk";
MessageBox(Handle, str.t_str(), TEXT("ok"), 0);
MessageBoxA(Handle, AnsiString(str).c_str(), "ok", 0);
MessageBoxW(Handle, String(str).c_str(), L"ok", 0);

AnsiString ansistr = "ansi string kk大厦大厦大厦大厦大厦kkkkkkkkkk";
MessageBox(Handle, String(ansistr).t_str(), TEXT("ok"), 0);
MessageBoxA(Handle, ansistr.c_str(), "ok", 0);
MessageBoxW(Handle, String(ansistr).c_str(), L"ok", 0);


zzbinfo 2011-09-21
  • 打赏
  • 举报
回复
2010就用个wchar_t转一下吧,不知道有没有其他好办法
cankoo 2011-09-21
  • 打赏
  • 举报
回复
xe2?我用C++BUILDER2010呢。
zzbinfo 2011-09-21
  • 打赏
  • 举报
回复
你说得这个问题可能跟编译器字符串的处理有关系,刚在xe2下试了就没有乱码
zzbinfo 2011-09-21
  • 打赏
  • 举报
回复
  wchar_t TT[200];
lstrcpyW(TT,str.w_str());
MessageBoxW(Handle,TT,L"ok",0);

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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