2011-12-06 104 views
7

私はバイト(char)のstd :: vectorを持っています。私はちょうど"Cスタイルキャスト"このベクターは、タイプwchar_tであるベクターに連結される。std :: vectorを "cast"する方法<wchar_t>

明らかに、データをコピーするだけですが、ここでは左側にUTF-16バイトストリームが既にあるので、それをベクトルに移動したいと思います私はそれを使用することができます。理想的には、私はバッファを交換するだけですが、私は安全な方法でそれを行う方法がわかりません...

安全な変換を効率的に行うためのC++の方法は何ですか?

注:

私はstd::wstringstd::vector<wchar_t>としての私のUTF-16文字列を格納んが、私は私が知っていることが起こるこのメモリバッファを持っているが、UTF-16である、と私は何とか、それをコピーする必要があります...

+2

何?あなたは 'char'として格納されたUTF-16データを持っていますか? 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

これを行うには、最も効率的(かつ神秘的)な方法はありません。 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バイトをコピーする必要はありませんでした。 :)

(免責事項:私はベクトルの大きさがsizeof(wchar_t)で割り切れることを仮定しているそうでなければ、あなたがlastポインタを調整する必要があります。)

+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'を使います。紛らわしいことに、イテレータがポインタであって、後で(別の実装や '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)); 
関連する問題