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

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

1、其实这跟字符Unicode编码有关系。前者运行时系统会当做是普通的字符串处理;而后者是定义在xml文件中的,也就是符合w3c协议的,即的前三个字符&#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();
}


}

你可能感兴趣的:(Android)