Android getText(@string/a)和直接使用字符的区别

你是否有发现android:text="&#xe60c;"跟android:text="@string/abc"(<string name="abc">&#xe60c;</string>)或者getText(R.string.abc);的显示效果不一样?

1、其实这跟字符Unicode编码有关系。前者运行时系统会当做是普通的字符串处理;而后者是定义在xml文件中的,也就是符合w3c协议的,即&#xe60c;的前三个字符&#x是转义字符,标识这是一个Unicode码值,相当于"\ue60c";所以系统在读取的时候就会按照w3c的协议进行读取,读取出来一个Unicode码值,然后在去自定义的字体文件里面查找对应的字符。

2、当然前者普通字符串也有对应的Unicode码值,但它的码值不是我们看到的e60c,它的码值储存在内存里面,我们是看不见的;而后者这些字符串通过前者的&#x这三个字符的转义是的后面的e60c表达的就是Unicode码值,而它真正要显示在屏幕上的字符在没有运行的情况下我们是不知道的。

3、在实际项目中会遇到一种情况:需要使用图标字体,但是显示哪个图标字体由后台返回的数据控制,后台返回的数据会包括:Unicode码值的字符串形式的数据,比如:\ue60c;。这个时候我们怎么处理呢?我这里附上一份代码,如果看懂了上面的原理,这个应该不难,如果有问题,欢迎留言或者评论,哈哈都没人评论。。。

public class MyStringUtils {
public static String unicode2String(String s) {
StringBuilder sb = new StringBuilder(s.length());
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
if (c == '\\' && chars[i + 1] == 'u') {
char cc = 0;
for (int j = 0; j < 4; j++) {
char ch = Character.toLowerCase(chars[i + 2 + j]);
if ('0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f') {
cc |= (Character.digit(ch, 16) << (3 - j) * 4);
} else {
cc = 0;
break;
}
}
if (cc > 0) {
i += 5;
sb.append(cc);
continue;
}
}
sb.append(c);
}
return sb.toString();
}


public static String string2Unicode(String s) {
StringBuilder sb = new StringBuilder(s.length() * 3);
for (char c : s.toCharArray()) {
if (c < 256) {
sb.append(c);
} else {
sb.append("\\u");
sb.append(Character.forDigit((c >>> 12) & 0xf, 16));
sb.append(Character.forDigit((c >>> 8) & 0xf, 16));
sb.append(Character.forDigit((c >>> 4) & 0xf, 16));
sb.append(Character.forDigit((c) & 0xf, 16));
}
}
return sb.toString();
}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值