VST内部での文字コードについて
VST SDKでは音声処理クラス・パラメータ操作クラスとVST GUIクラスでは扱っている文字コードが異なります。
音声処理クラス・パラメータ操作クラスなどはUTF-16を使用しています。
(VST SDKドキュメントにあるSDK Helper Classesに関連するクラスがUTF-16を使います。)
一方でVST GUIクラスなどはUTF-8を使用しています。
(VST SDKドキュメントにあるVSTGUI 4に関連するクラスがUTF-8を使います。)
UTF-16を使うクラス例 |
|
---|---|
UTF-8を使うクラス例 |
|
文字コードの違いによる注意点
文字コードが各クラスで違うため、クラス間で文字列をやり取りする場合は注意が必要です。
例えば、StringListParameterの文字列リストをもとにCOptionMenuクラスの文字列リストを作成する場合、扱っている文字コードが違うため、StringListParameterの文字列リストをCOptionMenuクラスにそのまま設定すると文字化けします。
また、GUI上(CTextEditクラスなど)で入力したファイルのパスをそのままEditControllerクラスのsendTextMessage()関数などを使ってAudioEffectクラスに渡して使っても正常にファイルが開けないなどの状況になります。
上記のような状態を避けるためには文字コードを意識しながらコーディングし、クラス間での文字列のやり取りの際には文字コードを変換する必要があります。
文字コードの変換方法の例は下記になります。
C++のSTL(string、wstringクラス)を使っています。(STLについての説明は割愛。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// wchar(UTF16)からchar(UTF8)に変換する関数 // (音声処理クラス・パラメータ操作クラスからVST GUIクラスに文字列を渡すとき) string toUTF8(wstring wstr) { // std::wstring_convertはC++17以降では非推奨 std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cv; return cv.to_bytes(wstr.data()); } // char(UTF8)からwchar(UTF16)に変換する関数 // (VST GUIクラスから音声処理クラス・パラメータ操作クラスに文字列を渡すとき) wstring toUTF16(string str) { // std::wstring_convertはC++17以降では非推奨 std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cv; return cv.from_bytes(str.data()); } |
std::wstring_convertはセキュリティ上の問題があるためC++17以降では非推奨となっています。使用の際はご注意ください。
なお、Windows環境の場合はMultiByteToWideChar()関数・WideCharToMultiByte()関数などを使用すれば大丈夫です。
さいごに
何かありましたらコメント欄や掲示板、Twitterにご質問をいただけばとおもいます。
また、出来たという報告もいただけるとありがたいです。
■掲示板
■Twitterアカウント:@vstcpp URL:https://twitter.com/vstcpp
良質な記事をありがとうございます。文字コード周りは本当に厄介ですね。
ところで、ご存知かもしれませんがstd::wstring_convertは粗末な仕上がりで危険なためC++17以降では非推奨のようです。(かといってちゃんと実装すると長くなってしまいますが…)
コメントありがとうございます。
std::wstring_convertは非推奨になっていたんですね…。
取り急ぎstd::wstring_convertが危険である旨追加いたしました。
貴重な情報ありがとうございます。