2013-03-21 3 views
0

У меня есть wstring, что лучше всего преобразовать ее в строку в скрытой форме, например \u043d\u043e\u043c\u0430?Как преобразовать wstring в строку как escapes

Один ниже работ, но, кажется, не лучшим:

string output; 
for (wchar_t chr : wtst) { 
    char code[7]; 
    sprintf(code,"\\u%0.4X",chr); 
    output += code; 
} 
+0

Если это «не кажется лучшим», могу ли я спросить, что вы (а) сравниваете с этим, и (б) почему вы не используете * это *? – WhozCraig

+0

он не компактен, занимает несколько строк кода. Я думаю, что может быть уже один однострочный конвертер в boost или std. –

+1

В стандартной библиотеке нет конвертера для этого, и если есть один в boost, было бы трудно быть более компактным, чем шесть строк кода реализации. Разумеется, сторона * вызывающего абонента (вы) была бы значительно уплотнена отношением ок. 83%, если такой конвертер * существует *. Опять же, введенная зависимость, безусловно, будет больше шести строк. Могли бы вы сделать * этот * более эффективным? Конечно. Начните с '.reserve()' в некоторой емкости. – WhozCraig

ответ

1

Менее компактный, но более быстрая версия, что а) распределяет загодя и б) позволяет избежать затрат на PRINTF ре-интерпретации формата Строка на каждой итерации, c) избежание служебных вызовов вызова функции printf.

std::wstring wstr(L"\x043d\x043e\x043c\x0430"); 
std::string sstr; 
// Reserve memory in 1 hit to avoid lots of copying for long strings. 
static size_t const nchars_per_code = 6; 
sstr.reserve(wstr.size() * nchars_per_code); 
char code[nchars_per_code]; 
code[0] = '\\'; 
code[1] = 'u'; 
static char const* const hexlut = "abcdef"; 
std::wstring::const_iterator i = wstr.begin(); 
std::wstring::const_iterator e = wstr.end(); 
for (; i != e; ++i) { 
    unsigned wc = *i; 
    code[2] = (hexlut[(wc >> 12) & 0xF]); 
    code[3] = (hexlut[(wc >> 8) & 0xF]); 
    code[4] = (hexlut[(wc >> 4) & 0xF]); 
    code[5] = (hexlut[(wc) & 0xF]); 
    sstr.append(code, code + nchars_per_code); 
} 
+0

Вы также можете ускорить это с помощью указателя на прямую запись в строку. Не все компиляторы смогут полностью встраивать вызовы функций в basic_string :: append. – Pete

Смежные вопросы