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

3

现在我正在使用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);

另一个例子。

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

两个结果是一样的。"abc"和"123"都能正常显示,但日文字符会出现乱码。

有什么想法吗?

2个回答

5
假设您正在加载自定义字体,比如太秦本丸ゴシック,则可以将其添加到每个原生平台项目中,然后通过该原生项目或基于Xamarin.Forms的项目使用它:

Android:

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;

iOS:

string fontName = "UzumasaFontMini.otf";
string customFontPath = NSBundle.MainBundle.PathForResource (Path.GetFileNameWithoutExtension (fontName), Path.GetExtension (fontName));

DrawText:

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

Android:

输入图片描述

iOS:

输入图片描述


谢谢。 我可以像你一样绘制日语。 但是我想使用默认或系统字体,而不是加载自定义字体。 在iOS上,我可以通过SKTypeface.FromFamilyName从UIFont.FamilyName获取SKTypeface。 你知道如何在Android上实现吗? - Masahiko Miyasaka

2

您真是个传奇! :) 您的帮助解决了我在项目中遇到的问题。 - Sebastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接