2011-12-06 5 views
7

나는 바이트 (char)의 std :: vector를 가지고 있는데, 단지 "C-style casting"이 벡터를 wchar_t 인 벡터로 변환합니다.std :: vector "cast"하는 방법 <char> std :: vector <wchar_t>

분명히, 데이터를 복사하는 것입니다.하지만 여기에는 왼쪽에 UTF-16 바이트 스트림이 이미 있습니다.이 코드를 wchar_t 벡터로 옮기고 싶습니다. 나는 그것을 사용할 수있다. 이상적으로, 나는 단지 버퍼를 교환하고 싶지만 안전한 방법으로 어떻게 할 지 모르겠다. ...

효율적인 변환 작업으로 C++을 수행하는 방법은 무엇입니까?

참고 :

내가 std::wstring 또는 std::vector<wchar_t>으로 내 UTF-16 문자열을 저장하지하지만 난 UTF-16 알 일이 메모리 버퍼를 가지고 있고, 나는 ...

어떻게 든 그것을 복사해야
+2

무엇 (면책 조항. 나는 그렇지 않으면 당신은 last 포인터를 조정해야 벡터의 크기가 sizeof(wchar_t)로 나누어 있으리라 믿고있어)? UTF-16 데이터가'char'로 저장되어 있습니까? Btw. 'char'에서'wchar_t' 로의 변환은'widen'을 사용하여 이루어집니다. 그러나 여러분이 원하는 것은 아닙니다. http://www.cplusplus.com/reference/std/locale/ctype/widen/ –

+0

http : // /www.codeproject.com/Tips/196097/Converting-ANSI-to-Unicode-and-back?display=Print가 대답 할 수 있습니다. –

+0

그리고 Let_Me_Be의 의견을 확장하십시오 : 왜 UTF-16 데이터가'char'로 저장 되었습니까? – Griwes

답변

9

가장 효율적인 (그리고 가장 sanest 한) 방법은 그것을하지 않는 것입니다. vector<char>에서 데이터 버퍼를 소유하고 벡터로 가리키는 반복자로 사용할 wchar_t 포인터 쌍을 작성하면됩니다.

std::vector<char> vec; 
wchar_t* first = reinterpret_cast<wchar_t*>(&vec[0]); 
wchar_t* last = reinterpret_cast<wchar_t*>(&vec[0] + vec.size()); 

이제는 모든 표준 라이브러리 알고리즘으로 잘 작동하는 반복기 쌍이 있습니다. 그리고 1 바이트를 복사 할 필요가 없었습니다. :)

:

+1

+1을 건전하고 단순함을 위해서 – johnathon

+0

그건 죽었어. 그리고 난 단지 할당을 사용하면 그걸 복사 할거야, 그렇지? 내 마음에 그것을 복사하는 것은 좋다, 나는 스왑 트릭을 기대했다. 내 말은, std :: vector의 내부 구조는 동일하고, 내부적으로 (reinterpret_cast와 같이) 내부 코드를 바꿔주고 싶습니다. 그러나 이것은 훌륭하게 수행 할 것입니다. –

+0

'static_cast'는 괜찮습니다. –

1
std::vector<char> v1; 
std::vector<wchar_t> v2; 

wchar_t *begin = (wchar_t *) &v2.front(); 
wchar_t *end = (wchar_t *) (&v2.back() + 1); 

v1.assign(begin, end); 

필자는 이것을 테스트하지 않았지만 이런 식으로는 작동하지 않을 것이라고 상상할 수는 없습니다 ... 엔디안 문제가있는 경우이 작업은 다소 복잡해집니다.

+0

'end()'는 반복자를 반환하기 때문에'end()'보다는'& v2.back() + 1'을 사용하십시오. 혼동스럽게도, iterator가 포인터가되고 나서 (다른 구현체 나'vector'의 디버그 버전으로) 나중에 작업하는 것을 멈추기 때문에 동작하는 것처럼 보일 수 있습니다. –

+0

@SteveJessop : 아주 좋은 지적입니다. 감사. –

1
std::vector<char> v1; 
std::vector<wchar_t> v2; 

const char * cv1 = v1.data(); 

const wchar_t * cv2 = static_cast<const wchar_t *>(cv1); 
std::copy(cv2, cv2 + v1.size()/sizeof(wchar_t), std::back_inserter(v2)); 
관련 문제