2013-03-21 3 views
0

wstring이 있는데, \u043d\u043e\u043c\u0430과 같이 이스케이프 된 형식으로 문자열로 변환하는 가장 좋은 방법은 무엇입니까?wstring을 이스케이프 문자열로 변환하는 방법

작품 아래 하나를 제외한 최고 될 것 같지 않습니다

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

"가장 좋지 않은 것"이라면, 당신이 (a) 그것을 비교하고 (b) 왜 * 사용하지 않는지 물어봐도 될까요? *? – WhozCraig

+0

작은 크기가 아니며 여러 줄의 코드가 필요합니다. 이미 boost 또는 std에 한 줄짜리 변환기가있을 수 있다고 생각합니다. –

+1

표준 라이브러리에는이 변환기가 없으며 부스트가있는 경우에는 6 줄의 구현 코드보다 압축하기가 어려울 것입니다. * 발신자 측 (당신)은 물론 대략 약 5 분의 1의 비율로 상당히 압축 될 것입니다. 그러한 변환기가 존재하면 83 % * 존재합니다. 그런 다음 다시 도입 된 의존성은 확실히 6 줄보다 커야합니다. 좀 더 효율적으로 만들 수 있습니까? 확실히. 약간의 용량을'.reserve() '로 시작하십시오. – WhozCraig

답변

1

A) 시간을 미리 할당하고, B)의 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

관련 문제