在Android上看起来像中文的日文字符

时间:2011-09-21 16:17:24

标签: android unicode localization cjk

PREAMBLE:从API 17(Android 4.2)开始,有一个方法TextView.setTextLocale()明确解决了TextViews和派生类的这个问题。指定日语区域设置(Locale.JAPAN),Unihan字符将显示为日语。


我在Android上有一个应用程序,它在WebViews和TextViews中显示日文文本。按照惯例,在中国和日本,有一些汉字(汉字)看起来不同,但共享相同的Unicode码点。通常,浏览器会依赖lang标记来选择正确的字形。在Android上,它们都默认为中文形状,我想要日文形状。

问题在this article中得到了很好的解释。这篇文章也可以作为问题的完美例证 - 当在Android上观看(最多2.2)时,“语言相关字符示例”中的字符看起来都一样,中文也是如此。

使用lang="ja"属性没有帮助。将整个系统区域设置切换为日语也无济于事。

我想知道在日本销售的Android手机。像rect,今,化这样的人物也会看起来像中国式吗?我假设没有。

所以问题是:那里有Android的官方本地化图片吗?我可以让一个人在模拟器上运行吗? DroidSansFallback字体仍然是那些唯一支持CJK的字体吗?如果是的话,它与香草美国Android上的相同吗?

我有点希望日语字形隐藏在字体深处(Unicode私有区域或其他东西)。如果是这样,我可以利用它们......

编辑:找到DroidSansJapanese.ttf,通过复制到/ system / fonts,重新启动它,将其安装在模拟器上。它对Unihan文章的外观没有任何影响。即使是日文输入的提示区域(应该知道更好)也会显示为中文。

我如何知道DroidSansJapanese.ttf的字体名称?我觉得它仍然是Droid Sans,与内置的DroidSansFallback字体相同。但是,如果它们包含相同的字体,那么哪个应该优先考虑?有人会想 - 系统区域设置,但显然不是。 Android中的字体只是通过复制安装,对吧?

3 个答案:

答案 0 :(得分:4)

找到了一个有点笨拙的解决方案。

DroidSansJapanese.ttf字体存在且可供下载,例如here。我下载了它,将其重命名为DroidSansJapanese.mp3以避免1MB压缩资产限制,并将其置于assets/web之下。然后我介绍了以下CSS语句:

@font-face
{
font-family: "DroidJP";
src:url('DroidSansJapanese.mp3')
}

然后我将'DroidJP'添加到每个相关CSS样式的font-family。我加载HTML的方式,assets/web文件夹已被指定为加载链接内容的基础。

仔细检查后,我在应用程序中找到了几个日语位于TextView的地方。对于那些,我加载了这样的字体:

Typeface s_JFont =
    Typeface.createFromAsset(Ctxt.getAssets(), "web/DroidSansJapanese.mp3");

并在每个相关的TextView上调用setTypeface()。现在为PROFIT!

这将我的APK扩展了大约1 MB。还有另一种方法,我将字体存储在压缩形式的资产中 - 这样可以节省大约500 KB的APK大小,但是我必须在第一次运行时将其扩展到手机内存,担心关于数据文件夹路径,并失去与Android 1.5的兼容性。

有些信用证到期:herehere。在Android 2.1(WebViews,而不是TextViews)上不起作用 - 这是known bug

现在,问题仍然存在 - 如何识别默认字体已包含日文形状的设备?

编辑重新:mp3黑客。我首先实现了分块解决方案,但随后决定使用资产中的字体。分块方法有一个好处 - 较小的APK大小 - 以及以下缺点:

  • 消耗更多手机内存 - 最终将压缩字体存储在资源中并在数据目录中保存未压缩
  • 与TextView方面的Android 1.5不兼容 - 方法Typeface.createFromFile()是在API级别4中引入的
  • 使HTML生成变得复杂 - 需要对带有@ font-face声明的CSS进行参数化,因为数据路径是变量
  • 放慢第一个应用启动速度 - 你花时间组合块

将字体存储为压缩资源也不是一个选项 - 然后该字体不会显示在WebView中,您可以在LogCat中清楚地看到有关“数据超过UNCOMPRESS_DATA_MAX”的消息。

答案 1 :(得分:4)

有些日语支持的字体。我听说有人谈论DroidSansJapanese.tff和TakaoPGothic。

答案 2 :(得分:0)

在您的onCreate / OnCreateView中使用以下内容:

AssetManager am = getContext().getApplicationContext().getAssets();
mDroidSansJapaneseTypeface = Typeface.createFromAsset(am, String.format(Locale.JAPAN, "fonts/%s", "DroidSansJapanese.ttf")); //I put the font file in the assets/fonts/ folder

然后显示您的文本视图:

myTextView.setTypeface(mDroidSansJapaneseTypeface);
myTextView.setTextLocale(Locale.JAPAN);

请注意,并非所有字体的100%都会在Android中显示。对于日语字符,我没有看到太多问题,但是无论您使用什么ttf文件,其他CJK字符都可能显示为空白框。