JUCEで日本語文字を表示するときのTips


JUCEって何?

JUCE (Jules' Utility Class Extensions)は、C++言語によるマルチメディア系アプリケーションの開発を支援するフレームワークです。クロスプラットフォーム設計のライブラリと、付属されているプロジェクトジェネレータ『Projucer』から各種IDE(VisualStudio, Xcode, Makefile)向けにプロジェクトファイルを出力することで、ワンソースからWindows, macOS, Linux, iOS, Android で動作するアプリケーションを作成することができます。
公式サイト

日本語の文字表示が豆腐になってしまう

JUCEフレームワークは主に英語圏で開発されている事もあり、英語以外の言語の文字表示があまり意識されていません。
以下の画像はjuce::AudioDeviceSelectorComponentの表示例ですが、チャンネル名に日本語文字列が含まれている場合、日本語の文字表示が豆腐になってしまいます。

簡単な解決方法

JUCEフレームワークでは、アプリケーション中のGUIの表示に関する詳細な実装(ルック・アンド・フィール)がjuce::LookAndFeelクラスで定義されています。
アプリケーションには必ずデフォルトのLookAndFeelオブジェクトが用意されているので、その設定を変更することでアプリケーション全体で使用するフォントを切り替えることができます。

以下では、OSがWindowsの場合ではWindowsに標準でインストールされていて日本語グリフが含まれているMeiryo UIフォントを、macOSの場合ではArial Unicode MSフォントを、Linuxの場合ではIPAGothicフォントを使用するように実装しています。

MainComponent::MainComponent()
{
#if JUCE_WINDOWS
  String typeFaceName = "Meiryo UI";
  Desktop::getInstance().getDefaultLookAndFeel().setDefaultSansSerifTypefaceName(typeFaceName);
#elif JUCE_MAC
  String typeFaceName = "Arial Unicode MS";
  Desktop::getInstance().getDefaultLookAndFeel().setDefaultSansSerifTypefaceName(typeFaceName);
#elif JUCE_LINUX
  String typeFaceName = "IPAGothic";
  Desktop::getInstance().getDefaultLookAndFeel().setDefaultSansSerifTypefaceName(typeFaceName);
#endif

     ~~~中略~~~
}

日本語文字が正しく表示された

ただし、デフォルトの設定を変更するため、アプリケーション全体にMeiryo UIフォントが適用されてしまうという副作用があります。
コンポーネントごとに適用したいフォントを切り替えるには、面倒ですがコンポーネントごとにフォントを切り替えるように実装コードを記述しましょう。

参考