在使用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还是乖乖用转换函数吧(