JUCEで日本語の文字列リテラルを使用する

2021/11/06に公開

C++での開発で、まずつまづくのが、日本語の文字列リテラルである。
特に、クロスプラットフォームでの扱いが面倒という印象がある。

まずは、こちらを御覧いただきたい。
https://forum.juce.com/t/embedding-unicode-string-literals-in-your-cpp-files/12600

このフォーラムの投稿にあるように、答えはUTF-8のコードを直接書くことである。

//こんにちは世界
juce::String textToDisplay  = juce::CharPointer_UTF8 ("\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe4\xb8\x96\xe7\x95\x8c");

UTF-8 String Literal Helperツールを使用してエンコード

フォーラムの投稿に有るように、「UTF-8 String Literal Helper」ツールを使用すると便利である。このツールは、Projucer→Toolsメニューから起動できる。

しかし、Projucerのフォントが日本語対応していないので、テキストボックスへ日本語を入力すると、四角で表示されてしまう。これはProjucerのコードを変更して、日本語フォントを使用するようにすれば良い。

アプリの大元のファイルっぽい「jucer_Application.cpp」の「initialise」関数内にフォントを指定するコードを追加した。こちらの記事のコードをそのままコピペした。
https://qiita.com/COx2/items/e2a8d1fb1ffa8a5af947

重要なのは、CharPointer_UTF8を使用すること

じつはWindows環境では、UTF-8のコードを直接書く必要は無いっぽい。
ソースファイルの文字コードをUTF-8にして以下のように書けば、正常に表示された。もちろん、フォントの設定が必要だが。

juce::String textToDisplay  = juce::CharPointer_UTF8("こんにちは世界");

しかし、以下のコードは文字化けした。

juce::String textToDisplay1 = L"こんにちは世界";  //文字化け
juce::String textToDisplay2 = u8"こんにちは世界"; //文字化け

他にも色々な記述方法を試した結果、必ず「juce::CharPointer_UTF8」を使用しないと文字化けするらしい、ということがわかった。
また、「L」や「u8」等のプレフィックスをつけたらダメっぽいということもわかった。

juce::CharPointer_UTF8って長ったらしい!

マクロを定義すると短くなって便利かも。
例えばこんなの。

#define ju8(x) juce::CharPointer_UTF8(x)

こうすると、以下のように書ける。

juce::String textToDisplay  = ju8("こんにちは世界");

まとめ

JUCEで日本語文字列リテラルを使用したい場合。
確実なのは、UTF-8のコードを直接書く。
Projucerの「UTF-8 String Literal Helper」ツールが便利。

//こんにちは世界
juce::String textToDisplay  = juce::CharPointer_UTF8 ("\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe4\xb8\x96\xe7\x95\x8c");

WindowsのVisual Studioでは、ソースファイルの文字コードをUTF-8にして、直接日本語を書く。

juce::String textToDisplay  = juce::CharPointer_UTF8("こんにちは世界");

直接日本語が書ける環境では、マクロを定義すると便利かも。

#define ju8(x) juce::CharPointer_UTF8(x)

juce::String textToDisplay  = ju8("こんにちは世界");

Discussion