带有wxWidgets,Unicode与ASCII的C ++,有什么区别?

时间:2011-09-03 16:13:15

标签: c++ unicode ascii wxwidgets

我有一个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位数据?

2 个答案:

答案 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字符集的差异,它们如何存储在内存中以及字符串函数如何与它们一起使用。

http://allaboutcharactersets.blogspot.in/