【问题标题】:Android: Russian Ruble currency not displayed on certain phone?Android:某些手机上不显示俄罗斯卢布货币?
【发布时间】:2015-07-26 05:27:13
【问题描述】:

我得到了一些带有格式字符串的 JSON 数据,像这样

₽35

但是,我注意到在 Nexus 5 (Lollipop) 上它可以正确显示,但在 HTC one mini 和三星 GT-I9505 等其他手机上,它会显示一个空白字符。

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

<?xml version="1.0" encoding="utf-8"?>

但我还是有同样的问题

请帮忙

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 中定义的俄罗斯卢布符号(注意我都试过了)

     <string name="rubleSymbolJava">\u20BD</string>
  <string name="rubleSymbolHTML">&#8381;</string>
    <string name="rubleSymbolHTMLHex">&#x20bd;</string>

同样的问题,在旧手机上显示为方形,但在 Android 5.0 上运行,但没有更早的版本。

已解决请看我的回答

【问题讨论】:

  • 您在问题中所做的复制/粘贴似乎弄乱了您的货币符号。至少,它没有显示为the Russian ruble sign。这些设备上使用的字体可能缺少此 Unicode 字形。
  • @DerGolem 我使用的是默认字体。没有习俗。它只是一个标准按钮。
  • @DerGolem 我刚刚做了一个测试。我使用了自定义字体 Roboto-Light.ttf,它没有该字形,但仅在 Nexus 5 上显示良好
  • @DerGolem,我会试试有它的字体
  • @CommonsWare。我刚刚尝试了根据 CommonsWare 提供的链接支持它的 Helvetica。它现在显示一个空白方块

标签: android


【解决方案1】:

我解决了这个问题。我刚刚使用了最新更新于 2015 年 1 月并带有卢布符号的新 Google Roboto 字体。

https://www.google.com/fonts/specimen/Roboto#pairings

研究表明,2014 年俄罗斯改变了他们的货币符号,所以旧字体没有新的字形,所以对于其他有类似问题的人,看看你的字体是否已经更新

【讨论】:

    【解决方案2】:

    问题手机的默认字体可能缺少俄罗斯卢布字形。尝试将其硬编码到应用程序某处的 TextView 中,以确保这确实是问题所在,而不是其他一些 JSON 解析错误左右(似乎不太可能,因为它适用于某些手机)。

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

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

    我没有太多使用图形设计器,但我相信它也不难。此外,这些说明适用于 Android Eclipse 插件。虽然 Android Studio 中的代码可能相同,但我不确定文件夹结构是否相同。文档说了一些关于将资产放置在 main/assets 而不仅仅是 assets 中的内容,例如...

    需要考虑的几点:

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

    额外的好处:您可以将一些自己的custom glyphs 添加到字体中,只需将相应的“字母”放入 TextView 即可轻松地将简单的单色矢量图形包含到您的应用中(还记得 Wingdings 吗?) .

    【讨论】:

    • 感谢您的回复。你推荐任何特定的字体吗?到目前为止,我尝试了 Helvetica 和 Ariel。这一次,显示的是一个正方形,而不是什么都没有。
    • Helvetica 和 Ariel(如果您谈论的是随 Windows 一起提供的那些)出于许可原因可能不是一个好的选择。我没有直接调查这个问题,但我怀疑如果你开始用你的应用程序发布他们的字体,微软会不会太高兴。 Google Fonts 有几个选择,其中一些对不同的语言有很好的支持。同样,您需要检查许可证。我不知道它们是否都可以使用。要检查包含的字形,您可以在系统上安装 TTF 并使用 Windows 字符映射。
    • 感谢您的警告,但我想暂时忽略许可问题,以证明是字体问题还是后端问题
    • @johncarter Google 有一个名为"Noto Fonts" 的项目,旨在支持尽可能多的语言。例如,Noto Sans 支持俄语并且可能也有卢布字形。但我会去将一个 TextView 放入您的应用程序中,该应用程序中有一个卢布标志。如果显示正确,则您的问题出在其他地方。如果没有,你的字体肯定也是一个问题(尽管可能不是唯一的)。但鉴于您的代码适用于 Nexus 5,我的第一个猜测是字体问题。
    • @johncarter Nexus 5 可能使用不同的字体或更完整版本的相同字体。此外,不同的设备(和软件)以不同的方式处理丢失的字形。有些什么都不画(例如Chrome),有些是空的矩形,有些是带有丢失字形的十六进制代码的矩形(Firefox)。也许 Nexus 只是使用默认字体中的字形而不是......
    【解决方案3】:

    我在那个答案 https://stackoverflow.com/a/36338231/1078641 中找到了解决方案,将 &amp;amp;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'>
    

    &amp;amp;subset=all 参数添加到链接后,我可以在我的Android 设备上成功看到卢布符号

    <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'>
    

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • @Milad,我添加了答案。
    • 现在看起来好多了;)
    【解决方案4】:

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

    阅读Trying to use <!ENTITY in ANDROID resources with error: "The entity was referenced, but not declared."后,我在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>
    

    values-v21/strings.xml:

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

    【讨论】:

      【解决方案5】:

      您可以使用以下代码检查字形是否存在 https://stackoverflow.com/a/29938454/755804

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 2013-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多