安卓系统中,日文字符看起来像中文的问题

27
自 Android 4.2(API 17) 开始,TextView及其子类中有一个方法TextView.setTextLocale()可以解决这个问题。将日语的locale(Locale.JAPAN)分配给此方法,汉字会呈现出日文风格。
我在Android应用程序中使用WebView和TextView显示日语文本,并且其中一些汉字(即“假名”)在中国和日本的书写惯例下看起来不同,但它们共享相同的Unicode代码点。通常,浏览器会依靠lang标签来选择正确的字形。但在Android上,它们全部默认使用了它们的中文样式,而我希望使用日文样式。
该问题在此文章中已经被很好地解释。当查看“Examples of language-dependent characters”一节时,在Android上(直到2.2)所有字符看起来都是相同的且仍然是中文。
使用lang="ja"属性无效。将整个系统语言设置为日语也没有效果。
我在想在日本销售的Android手机上,像“直”,“今”,“化”这样的字符是否也看起来像中文样式?我认为不是这样。
因此问题是:是否有官方本地化的Android映像可用?我能否在模拟器上运行它?在这些设备上,DroidSansFallback字体是否仍然是唯一支持CJK的字体?如果是,它与原版美国Android上的字体相同吗?
我有点希望日文字符藏在字体的某个深处(例如Unicode私有区域)中。如果真的如此,我可以利用它们......
编辑:找到了DroidSansJapanese.ttf,通过将其复制到/system/fonts中安装到模拟器中,并重新启动。但它对“汉字统一”文章没有任何影响。即使是日语输入法的提示区域(本应更好地处理该问题),也显示为中文。

我怎样才能知道DroidSansJapanese.ttf的字体名称?我有一种感觉它仍然是Droid Sans,就像内置的DroidSansFallback字体一样。但如果它们包含相同的字体,那么是什么决定哪一个应该具有优先权呢?人们可能会认为是系统语言环境,但显然不是。在Android中,字体只需要通过复制即可安装,对吗?


1
你的帖子中那些字符看起来像是中文风格的。 :) - Michael Bray
你发的那些字符是中文... 有些日语单词也会包含一些中文单词。 - xDragonZ
我在日本,没有遇到任何问题。我们公司在那儿有一部美国版的Galaxy S手机,能正常显示日文字符。在WebView中,如果不设置UTF-8 META标签,会引起问题:你可以发个链接或一个有问题的页面样例吗?你使用的设备是什么?如果提供更详细的信息,我可以试着回答这个问题。你现在只是说Android不能显示日文,我觉得这并不正确。 - DallaRosa
@DallaRosa:请参考http://en.wikipedia.org/wiki/Han_unification中“Examples of language-dependent characters”部分。在“Japanese”列中的字符仍然看起来像是中国风格的。我已经在Android模拟器1.5和2.2上尝试过了。 - Seva Alekseyev
好的,删除注释,发布答案。但是请问您能解释一下mp3黑客吗?我认为您在那篇帖子中提供的解决方案(分块)比黑客更加优雅。 - Mister Smith
显示剩余4条评论
3个回答

4

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

存在DroidSansJapanese.ttf字体并可供下载,例如这里。我将其下载下来,将其重命名为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()。现在可以获利了!

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

应该给予一些功劳:这里这里。在Android 2.1上不起作用(WebViews而不是TextViews) - 这是一个已知的错误

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

编辑关于mp3 hack。我首先实施了分块解决方案,但后来决定使用assets中的字体。分块方法有一个优点 - 更小的APK大小 - 和以下缺点:

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

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


我不理解 .mp3 的黑客技巧。从理论上讲,Android 资产打包工具不会压缩(或者说压缩效果不好)mp3 文件。如果你打开位于内核 \tools\aapt 包中的 Package.cpp Android 源文件,在文件顶部你可以找到一个名为 kNoCompressExt[] 的字符数组,其中列出了 mp3。 - Mister Smith
如果您存储的压缩资源超过1 MB,尝试通过AssetManager.open()打开它将会抛出错误。解决方法在此处列出(https://dev59.com/oXE85IYBdhLWcg3wRBRU#3093966)。 - Seva Alekseyev
准确地说,请阅读该帖子上的第二个答案。如果您将其重命名为mp3,则告诉AAPT不要压缩它,因为它已经被压缩了。 - Mister Smith

4

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


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

请注意,Android 并不能显示所有字体。对于日文字符,我并没有看到太多问题,但其他 CJK 字符可能会出现为空白框,无论你使用什么 ttf 文件。

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