SKIA绘制不出中文怎么办?以下为Windows环境绘制中文的方法
skia中需要将字符编码转换为utf8,切记切记
#include "windows.h"
void HelloWorld::onPaint(SkSurface* surface) {
auto canvas = surface->getCanvas();
// Clear background
canvas->clear(SK_ColorWHITE);
SkPaint paint;
paint.setColor(SK_ColorRED);
SkFont font;
font.setSubpixel(true);
font.setSize(20);
paint.setColor(SK_ColorBLACK);
canvas->save();
auto Gb2312_2_UTF8 =[](const char* gb2312)
{
int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if (wstr) delete[] wstr;
std::string strUtf8 = str;
if (str) delete[] str;
return strUtf8;
};
std::string str = Gb2312_2_UTF8("中文测试:一二三四,1234");
canvas->translate(0, 50);
canvas->rotate(fRotationAngle);
font.setTypeface(SkTypeface::MakeFromName("simsun", SkFontStyle::Italic()));
canvas->drawString(str.c_str(), 0, 20, font, paint);
canvas->drawString(str.c_str(), 0, 50, font, paint);
canvas->drawString(str.c_str(), 0, 80, font, paint);
canvas->drawString(str.c_str(), 0, 110, font, paint);
canvas->restore();
}
看下效果
运行效果
优化一下 //让我们废掉MultiByteToWideChar这种古老的转换吧,用用C++11新特性
auto string_2_utf8string1 = [](std::string str) {
// utf8-》unicode转换器
std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8_cvt;
// unicode-》gbk转换器
std::wstring_convert<std::codecvt<wchar_t, char, mbstate_t>> gbk_cvt(new std::codecvt<wchar_t, char, mbstate_t>("chs"));
std::wstring t = gbk_cvt.from_bytes(str);
return utf8_cvt.to_bytes(t);
};
网友评论