WCHARって何ですか? 文字列の変換

これまでchar型でしか文字列を扱ったことがなかったので、DirectXTexの画像ファイル読み込みでLPCWSTR(const WCHAR*)という型を見ても特に気にせず、L”文字列”と書けばいいやぐらいしか考えてませんでした。しかし、リテラルではなくconst char*のファイルパスを渡そうとするとコンパイルエラー、どうやら簡単に型のキャストで済むようなものではないらしい。

WCHAR( wchar_t )とは
Wikipedia ワイド文字
その他、ググって調べてみた。

文字列の内部表現が違うので、テキストファイル(char)から取得した文字列をそのままでは使えず、変換する必要があるようです。「wchar_t = 1文字」とは限らないので取扱いに注意(なんか中途半端な文字型のような気がする)。
C++11ではchar16_tやchar32_tという文字型があるので、今後慎重に文字列型の扱い方を考えていきたい。

文字列の変換方法を調べていくつか作成してみました。

mbstowcsを使った変換

文字列の変換にはmbstowcs_s(mbstowcsだと警告)を使用します。最初のmbstowcs_sにNULLを渡すことで変換後のサイズを取得し、必要なメモリを確保してmbstowcs_sで変換。wstringはwchar_tの文字列クラス。

std::codecvt(C++11)を使った変換

std::codecvtというクラスを使って変換を行います。ただ、使い方が少し変わっていて、codecvt conv;とせずにstd::use_facetという関数でライブラリが用意したインスタンス(ファセット)の参照を取得して使用します。1つのインスタンスを複数のプログラムで共有するため変換処理に内部状態を保持する状態クラス(ここではstd::mbstate_t)を渡すようになっています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.