Loading
柚木鉉の空間
0%
INITIALIZING
首页 文章 标签 归档 友链 推广 搜索
JUCE类库使用中文且不增加自带字库
文档编号 // 3CC4D4 在线

JUCE类库使用中文且不增加自带字库

2020-02-04
更新: 2026-04-25
1426 字符
这篇文章写于 2020,已经超过 6 年了。内容可能已经过时。

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

WeChat Pay 微信
Alipay 支付宝
导航 // 相关文章
目录