Android 安卓:俄罗斯卢布货币在某些手机上不显示?

Android 安卓:俄罗斯卢布货币在某些手机上不显示?,android,Android,我得到了一些JSON数据,其中包含一个格式化的货币字符串,如下所示 ₽35 然而,我注意到在Nexus5(棒棒糖)上显示正确,但其他手机,如HTC one mini和三星GT-I9505,显示空白字符 我试图研究这个问题,但除了在XML布局文件中确保这一行存在之外,我找不到其他解决方案 <?xml version="1.0" encoding="utf-8"?> strings.xml中定义的俄罗斯卢布符号(注:我尝试了所有) \u20BD ₽ ₽; 同

我得到了一些JSON数据,其中包含一个格式化的货币字符串,如下所示

₽35
然而,我注意到在Nexus5(棒棒糖)上显示正确,但其他手机,如HTC one mini和三星GT-I9505,显示空白字符

我试图研究这个问题,但除了在XML布局文件中确保这一行存在之外,我找不到其他解决方案

<?xml version="1.0" encoding="utf-8"?>
strings.xml中定义的俄罗斯卢布符号(注:我尝试了所有)

\u20BD
₽
₽;
同样的问题,在老款手机上显示为正方形,但在安卓5.0上工作,但在老款手机上没有


已解决请查看我的答案

您可以使用


如果不存在,则需要提供图像并使用或替换为字符序列。

问题手机的默认字体可能缺少俄罗斯卢布图示符。尝试将其硬编码到应用程序中的某个文本视图中,以确保这确实是问题所在,而不是其他JSON解析错误(在某些手机上工作时,这种情况似乎不太可能)

如果缺少glyph是您的问题,那么在项目中包含您自己的字体就相当简单了。这样,您就可以确保能够支持所需的所有glyph

以下是以编程方式执行此操作的步骤:

  • 将字体文件放入项目中的文件夹中
  • 通过将其作为对象加载(根据需要替换
    myFont
    font.ttf
  • 通过将其分配给所有用户等。似乎还有一些技巧可以让您将其设置为默认值
我没有太多地使用图形设计器,但我相信在那里也不难。此外,这些说明适用于Android Eclipse插件。虽然Android Studio中的代码可能相同,但我不确定文件夹结构是否相同。文档中说了一些关于将资产放入而不仅仅是资产的内容,例如

需要考虑以下几点:

  • 确保所选字体的分发不违反该字体的任何许可证
  • 你的应用程序现在将不再使用设备的默认字体,这意味着你的应用程序在不同的设备上看起来更加相似和可预测,但它可能会在使用不同默认字体的特定设备上的其他应用程序中脱颖而出
  • .ttf文件的大小将增加到应用程序的大小。大多数字体都相当小(约100KB),但有些字体会变大(数MB),特别是如果它们支持多种不同的语言,这可能会成为一个问题
  • 确保您的字体支持项目所需的所有语言中的所有字形

还有一个额外的好处:你可以在字体中添加一些自己的内容,只需将相应的“字母”放入文本视图(记得吗?)即可轻松地将简单的单色矢量图形包含到应用程序中。

我解决了这个问题。我刚刚使用了新的谷歌Roboto字体,上一次更新是2015年1月,上面有卢布符号


研究表明,2014年俄罗斯更改了货币符号,使旧字体没有新的字形,因此对于其他有类似问题的人,请查看您的字体是否已更新。

我在该答案中找到了解决方案,添加了
&;子集=所有
参数到Roboto字体链接

Roboto字体的原始链接是这样的

<link href='https://fonts.googleapis.com/css?family=Roboto:400,300italic,300,400italic,500,500italic,700,700italic' rel='stylesheet' type='text/css'>

你也可以检查Android版本。我认为,API 19上的一些手机支持俄罗斯卢布,但API 21上的手机都支持俄罗斯卢布。添加字符串资源比以编程方式检查和替换更容易

在阅读并尝试使用之后,我在
res/values-v21
中创建了一个新文件
strings.xml

因此,在
values/strings.xml
中:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
    <!ENTITY rouble "р.">
    ]>
<resources>
    <string name="saaki">Галстук Сааки - %1$s &rouble;</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
    <!ENTITY rouble "₽">
    ]>
<resources>
    <string name="saaki">Галстук Сааки - %1$s &rouble;</string>
</resources>

你在问题中的复制/粘贴似乎弄乱了你的货币符号。至少,它并没有显示为。这些设备上使用的字体可能缺少此Unicode字形。@DerGolem我使用的是默认字体。没有习俗。这只是一个标准按钮。@DerGolem我刚刚做了一个测试。我使用了一个自定义字体Roboto-Light.ttf,它没有这个字形,但在Nexus5上显示得很好only@DerGolem,我将尝试一种具有it@CommonsWare. 我刚刚尝试了Helvetica,根据Commonware提供的链接,它支持Helvetica。它现在显示一个空白的方块,谢谢你的回复。你推荐什么特别的字体吗?到目前为止,我试过Helvetica和Ariel。这一次,显示的是一个正方形,而不是什么都没有。出于许可的原因,Helvetica和Ariel(如果你说的是Windows附带的那些)可能不是一个好的选择。我没有直接调查这个问题,但我怀疑如果你开始在你的应用程序中提供他们的字体,微软会不会太高兴。有几个备选方案,其中一些对不同语言有很好的支持。同样,您需要检查许可证。我不知道它们是否都可以使用。要检查包含的标志符号,您可以在系统上安装TTF并使用Windows字符映射。感谢您的警告,但我想暂时忽略许可问题,以证明它是字体还是后端issue@johncarter谷歌有一个名为aim的项目,旨在支持尽可能多的语言,例如,支持俄语,可能还有卢布铭文。但我只想在你的应用程序中放一个带有卢布符号的文本视图。如果显示正确,则问题出在其他地方。如果不是,你的字体肯定也是一个问题(尽管可能不是唯一的问题)。但是考虑到您的代码在Nexus 5上运行,我的第一个猜测是字体问题。@johncarter Nexus 5可能使用了不同的字体或相同字体的更完整版本。此外,不同的设备(和软件)处理丢失的图示符的方式也不同。有些人什么也不画(镀铬)
<link href='https://fonts.googleapis.com/css?family=Roboto:400,300italic,300,400italic,500,500italic,700,700italic&amp;subset=all' rel='stylesheet' type='text/css'>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
    <!ENTITY rouble "р.">
    ]>
<resources>
    <string name="saaki">Галстук Сааки - %1$s &rouble;</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
    <!ENTITY rouble "₽">
    ]>
<resources>
    <string name="saaki">Галстук Сааки - %1$s &rouble;</string>
</resources>