JUCEで日本語の文字列リテラルを使用する
C++での開発で、まずつまづくのが、日本語の文字列リテラルである。
特に、クロスプラットフォームでの扱いが面倒という印象がある。
まずは、こちらを御覧いただきたい。
このフォーラムの投稿にあるように、答えは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」関数内にフォントを指定するコードを追加した。こちらの記事のコードをそのままコピペした。
重要なのは、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