VST内部での文字コードについて

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を使うクラス例
  • AudioEffectクラス(音声処理クラスの継承元)
  • EditControllerクラス(パラメータ操作クラスの継承元)
  • EventBus、AudioBusクラス
  • Parameterクラス
  • PresetFile
  • Unit   など
UTF-8を使うクラス例
  • VSTGUIEditor(VST GUIクラスの継承元)
  • CControlクラス、およびCControlを継承したクラス(CButtonクラス、COptionMenuクラス、CTextEcitクラスなど)
  • CNewFileSelectorクラス、CFileExtensionクラス、CFileStreamクラス(ファイル操作関連のクラス)
  • CBitmapクラス
  • CFontDescクラス   など

文字コードの違いによる注意点

文字コードが各クラスで違うため、クラス間で文字列をやり取りする場合は注意が必要です。

例えば、StringListParameterの文字列リストをもとにCOptionMenuクラスの文字列リストを作成する場合、扱っている文字コードが違うため、StringListParameterの文字列リストをCOptionMenuクラスにそのまま設定すると文字化けします。
また、GUI上(CTextEditクラスなど)で入力したファイルのパスをそのままEditControllerクラスのsendTextMessage()関数などを使ってAudioEffectクラスに渡して使っても正常にファイルが開けないなどの状況になります。

上記のような状態を避けるためには文字コードを意識しながらコーディングし、クラス間での文字列のやり取りの際には文字コードを変換する必要があります。

文字コードの変換方法の例は下記になります。
C++のSTL(string、wstringクラス)を使っています。(STLについての説明は割愛。)

std::wstring_convertはセキュリティ上の問題があるためC++17以降では非推奨となっています。使用の際はご注意ください。
なお、Windows環境の場合はMultiByteToWideChar()関数・WideCharToMultiByte()関数などを使用すれば大丈夫です。

さいごに

何かありましたらコメント欄や掲示板Twitterにご質問をいただけばとおもいます。
また、出来たという報告もいただけるとありがたいです。

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp


One thought on “VST内部での文字コードについて

  1. 良質な記事をありがとうございます。文字コード周りは本当に厄介ですね。
    ところで、ご存知かもしれませんがstd::wstring_convertは粗末な仕上がりで危険なためC++17以降では非推奨のようです。(かといってちゃんと実装すると長くなってしまいますが…)

    1. コメントありがとうございます。

      std::wstring_convertは非推奨になっていたんですね…。
      取り急ぎstd::wstring_convertが危険である旨追加いたしました。
      貴重な情報ありがとうございます。

匿名 へ返信するコメントをキャンセル