strings.xml中的那些特殊字符

/ 0评 / 0

前言

今天在解决项目中的Warn的时候,发现string.xml里面出现了几个有意思的警告,所以分享给各位有强迫症的程序猿们。Warn信息如下

<1> Replace "..." with ellipsis character (…, &&;#8230;) ?
<2> Multiple annotations found at this line:
    - error: Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" 
     attribute?
    - error: Unexpected end tag string

警告<1>

我在string.xml中的使用是<string name="load_tip">正在加载中...</string>,提示信息为Replace "..." with ellipsis character (…, &&;#8230;) ?,也就是需要我们将...替换为后面的一个字符,不过个人尝试了下,解决办法是将...替换为Unicode表示,也就是<string name="load_tip">正在加载中\u2026</string>关于编码方式的区别可以查看字符编码这篇博客。同样的,对于其他一些特殊的符号,比如"°",在xml文件中使用的时候最好也是使用Unicode形式表示,也就是\u00B0

警告<2>

对于警告二是由于项目需要适配多语言环境,比如对于中国,时间显示为2017年01月01日,在英文下肯定不能这样显示了,所以将时间格式写在xml文件中,这样就可以根据语言的不同显示不同的格式了。

最初的想法是在xml中使用

<string name="time_format">%d年%02d月%02d日</string>

然后在代码中使用如下代码。

Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
String time_format = getResources().getString(R.string.time_format);
String timeStr = String.format(time_format,year, month, day)

没想到出现了警告<2>,反复检查后发现是string.xml中的 % 导致编译失败,只要将上面的%d换成%1$d就行了,如果有多个,就依次为%1$d、%2$d、%3$d。

额外,如果你想%出现在字符串中,可以使用转义字符,也就是%%,或者使用<string name="test" formatted="false">% test %</string>即可。

其他

xml格式默认将标签开头和结尾的空格给省略,如下

<string name="unknow_radio_detail">    暂无视频详情</string>

会被解析成没有空格的形式,相当于被系统执行了一次trim操作。如果需要空格则应该为下面的形式:

<string name="unknow_radio_detail">&#160;&#160;&#160;&#160;暂无视频详情</string>

规则就一点:在string.xml中,如果需要特殊字符,一般使用Unicode形式即可

参考博客:找骨头的啊呜

发表评论

您的电子邮箱地址不会被公开。