美文网首页
Skia输出中文(Windows环境)

Skia输出中文(Windows环境)

作者: 豪爵吸金ing | 来源:发表于2020-04-09 15:35 被阅读0次

    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);
        };
    

    相关文章

      网友评论

          本文标题:Skia输出中文(Windows环境)

          本文链接:https://www.haomeiwen.com/subject/nkucmhtx.html