如何在 Xamarin 上使用 SkiaSharp 绘制日语文本

Mas*_*aka 3 android xamarin skiasharp

现在我在 Xamarin Android 上使用 SkiaSharp。

我想用 SKCanvas.DrawText 绘制日语文本,但是日语字符是乱码。

我看到了这个 类似的问题,所以我尝试将文本转换为 UTF-8,但结果是一样的。

我试过如下。

var s = "abc???123???";
var buf = System.Text.Encoding.UTF8.GetBytes(s);
var utf8s = Encoding.UTF8.GetString(buf);
skcanvas.DrawText(utf8s, 50, 50, paint);
Run Code Online (Sandbox Code Playgroud)

另一个。

var s = "abc???123???";
var dest = Encoding.UTF8;
var src = Encoding.Default;
var buf = src.GetBytes(s);
var buf2 = Encoding.Convert(src,dest, buf);
var utf8s = dest.GetString(buf2);
skcanvas.DrawText(utf8s, 50, 50, paint);
Run Code Online (Sandbox Code Playgroud)

两者结果相同。“abc”和“123”画得很好,但是日文乱码。

任何的想法?

Sus*_*ver 5

假设您正在加载自定义字体,例如Uzumasa Honmaru Gothic,您可以将其添加到您的每个本机平台项目中,然后通过该本机项目或Xamarin.Forms基于 - 的项目使用它:

安卓:

string fontName = "UzumasaFontMini.otf";
string fontPath = Path.Combine (CacheDir.AbsolutePath, fontName);
using (var asset = Assets.Open (fontName))
using (var dest = File.Open (fontPath, FileMode.Create)) {
    asset.CopyTo (dest);
}
string customFontPath = fontPath;
Run Code Online (Sandbox Code Playgroud)

IOS:

string fontName = "UzumasaFontMini.otf";
string customFontPath = NSBundle.MainBundle.PathForResource (Path.GetFileNameWithoutExtension (fontName), Path.GetExtension (fontName));
Run Code Online (Sandbox Code Playgroud)

绘制文本:

string text = "abc???123";
using (var paint = new SKPaint ()) {
    canvas.Clear (SKColors.Black);
    paint.IsAntialias = true;

    using (var tf = SKTypeface.FromFile (customFontPath)) {
        paint.Color = SKColors.White;
        paint.TextSize = 20;
        paint.Typeface = tf;

        canvas.DrawText (text, 50, 50, paint);
    }
}
Run Code Online (Sandbox Code Playgroud)

安卓:

在此处输入图片说明

IOS:

在此处输入图片说明