2011-09-03 22 views
1

我有一个代码:: Blocks的10.05 REV 0和GCC 4.5.2 Linux的/ Unicode的64位和 wxWidgets版本2.8.12.0-0
我有一个简单的问题:带有wxWidgets的C++,Unicode与ASCII,有什么区别?

#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()); 

printf的输出“/ PATH/TO/FILE“,而wxLogVerbose变成废话。当我想改变的std :: string到wxString我必须做以下几点:

wxString buf; 
buf = wxString::From8BitData(file_procstatus.c_str()); 

有人有一个想法是什么可能是错误的,为什么我需要从8位数据的变化?

回答

4

这是关于如何将字符数据存储在内存中。使用“字符串”,您使用ASCII字符集生成char类型的字符串,而我将假定_TT宏扩展为L“字符串”,它使用Unicode字符集(Linux I上的UTF-32创建类型wchar_t的字符串相信)。

printf函数需要一个char的字符串,而wxLogVerbose我认为期待一个wchar_t字符串。这是转换需求的来源。 ASCII使用每个字符一个字节(8位数据),但wchar_t字符串使用每个字符多个字节,所以问题归结为字符编码。

如果你不希望有调用此转换功能,然后像做了以下内容:

wstring file_procstatus = wxT("/PATH/TO/FILE"); 
wxLogVerbose(_TT("%s"),file_procstatus.c_str()); 
+0

使用wsString insted的STD的:字符串可能是一个解决方案,但是如果使用OS功能(和STL功能也是如此),我需要一切转换时,总会有问题。而使用总是_TT(别名为wxT)是非常恼人的。所以我可能必须坚持将std :: string转换为wxString。 :) – ptrl4me

+0

@ ptrl4me:我认为wxString应该可以使用STL函数,而且在我看来'std :: string'对于OS函数来说并不方便。 – UncleBens

0

下面的文章提供了有关在Unicode和差异ASCII字符集最好的解释,他们是如何保存在内存中以及字符串函数如何与它们一起工作

http://allaboutcharactersets.blogspot.in/

+0

这篇文章比这个问题的其他答案更多吗? –