说,我想在本机脚本中显示10种语言的列表,如果手机不支持该字体,它将回退到英文脚本。有什么方法可以检测特定设备支持哪些字体? 换句话说,我只是想检查一下,是否"旁遮普"可以显示为"ਪੰਜਾਬੀ"
答案 0 :(得分:2)
为了安全起见,我会同时使用英文和本地名称(这就是我实际做的)。请怜惜这个可怜的家伙看到所有这些فارسی赣语ગુજરાતીՀայերենहिन्दीবিষ্ণুপ্রিয়ামণিপুরীעבריתಕನ್ನಡქართულიລາວمصرىनेपालभाषाОлыкмарийភាសាខ្មែរСрпскиதமிழ்文言ייִדיש中文在本地脚本而已!
您还可以尝试将文本绘制到位图中,并检查生成的位图是否为空白。 例如。 http://www.skoumal.net/en/android-how-draw-text-bitmap 和 How to check if a Bitmap is empty (blank) on Android (当然,假设不支持的字母没有显示为黑色钻石或类似的东西)。
class Util {
private static final int WIDTH_PX = 200;
private static final int HEIGHT_PX = 80;
public static boolean isSupported(Context context, String text) {
int w = WIDTH_PX, h = HEIGHT_PX;
Resources resources = context.getResources();
float scale = resources.getDisplayMetrics().density;
Bitmap.Config conf = Bitmap.Config.ARGB_8888;
Bitmap bitmap = Bitmap.createBitmap(w, h, conf); // this creates a MUTABLE bitmap
Bitmap orig = bitmap.copy(conf, false);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.rgb(0, 0, 0));
paint.setTextSize((int) (14 * scale));
// draw text to the Canvas center
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
int x = (bitmap.getWidth() - bounds.width()) / 2;
int y = (bitmap.getHeight() + bounds.height()) / 2;
canvas.drawText(text, x, y, paint);
boolean res = !orig.sameAs(bitmap);
orig.recycle();
bitmap.recycle();
return res;
}
}
测试代码:
String s;
s="";Log.d("~~~","=="+s+"=="+Util.isSupported(this, s));
s="中文";Log.d("~~~","=="+s+"=="+Util.isSupported(this, s));
s="ਪੰਜਾਬੀ";Log.d("~~~","=="+s+"=="+Util.isSupported(this, s));
s="Հայերեն";Log.d("~~~","=="+s+"=="+Util.isSupported(this, s));
输出:
====false
==中文==true
==ਪੰਜਾਬੀ==false
==Հայերեն==true
PS如果要在同一个字符串中显示英文和本机名称,可以在编写具有两个名称的字符串之前检查本机名称是否可以显示,或者删除拉丁字符:
public static String stripLatin(String s) {
String res = "";
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) > 127) {
res += s.charAt(i);
}
}
return res;
}
测试代码:
s="Punjabi(ਪੰਜਾਬੀ)";Log.d("~~~","=="+s+"=="+Util.isSupported(this, Util.stripLatin(s)));
答案 1 :(得分:1)
根据this,没有直接的方法可以做你想做的事。在该答案中提出了一种比较绘制的字形的方法,但没有编程的简单方法。
另一种方法是查看预装字体支持的语言。从Froyo开始,Android上的标准字体是Roboto和Noto - Roboto用于“英语”语言字符,而Noto用于其他所有字体。您可以找到Roboto支持的字符here的完整列表。然后是Noto,它专门用于防止在无法显示角色时发生的那些奇怪的块状“豆腐”角色。您可以找到支持的诺托语言here列表。据推测,每种语言至少具有基本的Noto字体支持,能够在自定义安装时支持更复杂的字体(衬线等)。 This是查看每种语言类型可支持哪种字体的有用指南。
根据this,除了“类似英语”的Roboto之外,默认系统上安装的主要Noto字体是NotoSerif-Regular。您可以通过转到自己的system_fonts.xml
来确认这一点,以查看其中安装的内容。另一种多语言字体称为Droid Sans
,here是它支持的语言列表。