Как преобразовать wstring в строку как escape

У меня есть wstring, как лучше конвертировать его в строку в экранированном виде, как \u043d\u043e\u043c\u0430 ?

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

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

0

Решение

Менее компактная, но более быстрая версия, которая а) выделяет раньше времени и б) избегает затрат на printf при повторной интерпретации строки формата на каждой итерации, в) избегая накладных расходов на вызов функции для 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 = "0123456789abcdef";
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);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]