在使用JUCE的时候,i18n字体是一个大问题,由于JUCE使用的 CharPointer_ASCII() 只能接受127位的字符,中文这样的大胖子就不可能了。

于是我们需要用一个新的“东西”来接受更多内容: CharPointer_UTF8()

但是这东西又有问题,它不支持标准的中文输入,只可以用 \xe4\xb8\xad\xe6\x96\x87 这样的字体编码来转换,其实这也避免了WinNT平台的一些编码错误

JUCE使用了:UTF16 -> UTF8来显示中文字符,这本来没什么问题,问题是它不知道这是中文,于是它默认读取了本地的字库,Boom

解决方法:

initialise函数中强行选择内容:

void initialise(const String& commandLine) override {
#if JUCE_IOS
    LookAndFeel::getDefaultLookAndFeel().setDefaultSansSerifTypefaceName("Heiti SC");
#elif JUCE_ANDROID
    LookAndFeel::getDefaultLookAndFeel().setDefaultSansSerifTypefaceName("Droid Sans");
#elif JUCE_MAC
    LookAndFeel::getDefaultLookAndFeel().setDefaultSansSerifTypefaceName("Hei");
#elif JUCE_WIN32
    LookAndFeel::getDefaultLookAndFeel().setDefaultSansSerifTypefaceName("YeHei");
#endif
    mainWindow.reset(new MainWindow(getApplicationName()));
}

通过:

LookAndFeel::getDefaultLookAndFeel().setDefaultSansSerifTypefaceName("字体名称");

来定义字体环境,当需要使用中文的地方,使用JUCE自带的转换器将中文字符进行转换(官方转换器不支持中文输入,这里提供一个第三方支持版本:JUCEUTF8

然后在使用的时候

CharPointer_UTF8("\xe4\xb8\xad\xe6\x96\x87");

例如:
g.drawText(CharPointer_UTF8("\xe4\xb8\xad\xe6\x96\x87"), getLocalBounds(), Justification::centred, true);

当然,看 \xe4\xb8\xad\xe6\x96\x87 文字根本不知道是什么,如果你不需要在Windows系统下正常使用,用 L 也可以做到:

L"中文";
  
例如:
g.drawText(L"中文", getLocalBounds(), Justification::centred, true);

如果是WIndows还是乖乖用转换函数吧(