Skia输出中文(Windows环境)

2020-04-09  本文已影响0人  豪爵吸金ing

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);
    };
上一篇下一篇

猜你喜欢

热点阅读