我有一个Code :: Blocks 10.05 rev 0和gcc 4.5.2 Linux / unicode 64bit和
WxWidgets版本2.8.12.0-0
我有一个简单的问题:
#define _TT(x) wxT(x)
string file_procstatus;
file_procstatus.assign("/PATH/TO/FILE");
printf("%s",file_procstatus.c_str());
wxLogVerbose(_TT("%s"),file_procstatus.c_str());
当wxLogVerbose变为废话时,Printf会正常输出“/ PATH / TO / FILE”。当我想将std :: string更改为wxString时,我必须执行以下操作:
wxString buf;
buf = wxString::From8BitData(file_procstatus.c_str());
有人知道可能出现的问题,为什么我需要更改8位数据?
答案 0 :(得分:4)
这与字符数据如何存储在内存中有关。使用“字符串”,您使用ASCII字符集生成类型为char
的字符串,而我假设_TT
宏扩展为L“字符串”,它创建一个类型为wchar_t
的字符串使用Unicode字符集(我相信Linux上的UTF-32)。
printf
函数需要char
字符串而wxLogVerbose
我假设期待wchar_t
字符串。这就是转换需求的来源。 ASCII每个字符使用一个字节(8位数据),但wchar_t
个字符串每个字符使用多个字节,所以问题在于字符编码。
如果您不想调用此转换函数,请执行以下操作:
wstring file_procstatus = wxT("/PATH/TO/FILE");
wxLogVerbose(_TT("%s"),file_procstatus.c_str());
答案 1 :(得分:0)
以下文章最好地解释了Unicode和ASCII字符集的差异,它们如何存储在内存中以及字符串函数如何与它们一起使用。