Android:某些手机上没有显示俄罗斯卢布货币?
Android:某些手机上没有显示俄罗斯卢布货币?
我正在获取一些带有货币格式的JSON数据,如下所示
₽35
然而,我注意到在Nexus 5(Lollipop)上显示正确,但其他手机如HTC one mini和Samsung GT-I9505上显示为空字符。
我尝试研究了这个问题,除了在XML布局文件中确保存在以下行之外,我找不到其他解决办法
但我仍然遇到了同样的问题
请帮忙
编辑于2015年5月15日
加载自定义字体NotoSans(请注意,我知道这会泄露内存,但这只是一个快速测试)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView ruble = (TextView)findViewById(R.id.ruble); Typeface myFont = Typeface.createFromAsset(getAssets(),"fonts/NotoSans-Regular.ttf"); ruble.setTypeface(myFont); }
在strings.xml中定义的俄罗斯卢布符号(请注意我尝试了所有)
\u20BD ₽ ₽
同样的问题,在较旧的手机上显示为方块,但在Android 5.0上可以正常工作,但在旧版本上不行。
问题已解决,请参见我的答案
问题出现的原因是在某些手机上无法显示俄罗斯卢布货币符号。解决方法是将&subset=all
参数添加到Roboto字体链接中。
原始的Roboto字体链接如下:
<link href='https://fonts.googleapis.com/css?family=Roboto:400,300italic,300,400italic,500,500italic,700,700italic' rel='stylesheet' type='text/css'>
在链接中添加&subset=all
参数后,我成功在我的Android设备上看到了卢布符号。
尽管此链接可能回答了问题,但最好在这里包含答案的关键部分,并提供链接供参考。如果链接的页面发生变化,仅包含链接的答案可能会失效。
我已经添加了答案。
现在看起来好多了 😉
Android: 俄罗斯卢布货币在某些手机上未显示?
问题出现的原因可能是手机的默认字体缺少俄罗斯卢布的字符。尝试在应用程序的某个位置将其硬编码到TextView中,以确保这确实是问题所在,而不是其他JSON解析错误等(因为它在某些手机上工作正常)。
如果缺失字符是问题所在,那么在项目中包含自己的字体非常简单。这样,您可以确保支持所需的所有字符。
以下是以编程方式执行此操作的步骤:
- 将字体的.ttf文件放入项目中的assets/fonts文件夹中
- 使用TypeFace对象加载它,通过`TypeFace myFont = Typeface.createFromAsset(activity.getAssets(), "fonts/font.ttf")`
- 将其分配给所有的TextView,Paints等,通过`myTextView.setTypeface(myFont)`
要考虑的几个问题:
- 确保所选择的字体分发不违反任何字体的许可证
- 您的应用程序将不再使用设备的默认字体,这意味着您的应用程序在不同设备上的外观更加相似和可预测,但它可能在使用非常不同的默认字体的特定设备上与其他应用程序不同。
- .ttf文件的大小将增加您的应用程序的大小。大多数字体都很小(约100KB),但有些字体会很大(几MB),特别是如果它们支持许多不同的语言,这可能会成为一个问题。
- 确保您的字体支持您的项目所需的所有语言中的所有字符。
额外的好处:您可以将一些自定义字符添加到字体中,通过将相应的“字母”放入TextView中,可以轻松地在应用程序中包含简单的单色矢量图形。
谢谢回复。您推荐使用哪些特定的字体?到目前为止,我尝试了Helvetica和Arial。这次,显示的是一个方块,而不是什么都没有。
Helvetica和Arial(如果您说的是Windows中附带的字体)可能不是一个好选择,因为涉及到许可问题。我没有直接研究过这个问题,但我怀疑如果您开始在应用程序中使用他们的字体,Microsoft可能会不太高兴。Google Fonts有一些替代方案,其中一些对不同语言有很好的支持。同样,您需要检查许可证是否允许直接使用这些字体。您可以安装TTF并使用Windows字符映射来检查包含的字符。
谢谢警告,但我想暂时忽略许可问题,以证明问题是字体还是后端问题。
Google有一个名为“Noto Fonts”的项目,旨在支持尽可能多的语言。例如,Noto Sans支持俄罗斯语,可能也有卢布字符。但我建议您在应用程序中添加一个包含卢布符号的TextView。如果显示正确,则问题出现在其他地方。如果不正确,则字体肯定也是问题(尽管可能不是唯一的问题)。但鉴于您的代码在Nexus 5上运行正常,我首先猜测是字体问题。
您能检查我的编辑吗?我仍然有同样的问题,只是显示为一个方块。在Android 5.0上可以正常工作,但在旧版本上无法正常工作。而且这次我是将字符串硬编码(不再从后端获取),问题仍然存在。请帮助。
如果在Windows中双击ttf文件,会打开一个预览,在顶部会有一个名为“安装”的按钮。点击该按钮并等待完成。然后,打开Windows的“字符映射”。在顶部选择您的字体,点击并按住鼠标按钮,在字符中快速扫描。左下方显示您正在悬停的字符的Unicode值(例如U+0321)。检查您选择的字体是否具有U+20BD(卢布符号)。出于某种原因,Noto没有。您需要继续寻找具有此字符的字体。
谢谢。是的,它没有。但这太奇怪了,如果字体没有该字符,那么它不应该在Android 5.0设备上显示,但它仍然显示出来。
在我的机器(Win-7 64bit)上,Microsoft的Arial有卢布字符,Times New Roman也有(您可以在C:\Windows\Fonts下找到它们的ttf文件)。Courier New没有。顺便说一下:也许使用ISO 4217货币代码(RUB和USD)而不是符号会更容易和可靠,以避免与字体的许可问题。
Nexus 5可能使用不同的字体或相同字体的更完整版本。此外,不同的设备(和软件)对缺失字符的处理方式不同。有些不显示任何内容(例如Chrome),有些显示一个空的矩形,有些显示带有缺失字符的十六进制代码的矩形(Firefox)。也许Nexus只是使用其默认字体的字形。
我刚刚尝试了Arial,它可以工作并显示,所以确实是字体的问题。我想我会像您说的那样使用ISO 4217货币代码,以避免与字体的许可问题。