C ++ с wxWidgets, Unicode против ASCII, в чем разница? - PullRequest
1 голос
/ 03 сентября 2011

У меня есть 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());

Вывод PrintfОбычно "/ PATH / TO / FILE" в то время как wxLogVerbose превращается в дерьмо.Когда я хочу изменить std :: string на wxString, я должен сделать следующее:

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

У кого-то есть идея, что может быть не так, зачем мне переходить с 8-битных данных?

Ответы [ 2 ]

4 голосов
/ 03 сентября 2011

Это связано с тем, как символьные данные хранятся в памяти. Используя «строку», вы создаете строку типа char, используя набор символов ASCII, тогда как я предполагаю, что макрос _TT расширяется до L «строка», которая создает строку типа wchar_t с использованием набора символов Unicode ( UTF-32 на Linux я верю).

функция printf ожидает строку char, тогда как wxLogVerbose я предполагаю, что ожидается строка wchar_t. Отсюда и необходимость конверсии. ASCII использовал один байт на символ (8-битные данные), но строки wchar_t используют несколько байтов на символ, поэтому проблема заключается в кодировке символов.

Если вы не хотите вызывать эту функцию преобразования, сделайте что-то вроде следующего:

wstring file_procstatus = wxT("/PATH/TO/FILE");
wxLogVerbose(_TT("%s"),file_procstatus.c_str());
0 голосов
/ 19 февраля 2012

Следующая статья дает лучшее объяснение различий в наборе символов Unicode и ASCII, как они хранятся в памяти и как с ними работают строковые функции.

http://allaboutcharactersets.blogspot.in/

...