我已经在网上的各个地方读过Java内部使用UTF-16来表示String对象。这意味着String中的每个字符都需要两个字节。但是,对于以下代码,我们发现每个字符在字符串中可能采用可变数量的字节。
button.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"icon_ab_delete.png"]];
以上程序的输出是:
button.backgroundColor = [UIColor greenColor];
每个字符的对应代码点是:
public class ChracterSize {
public static void main(String[] args) {
String s = "\u0061\u024E\u2013\u65E5";
System.out.println(s + " " + s.getBytes().length);
System.out.println("\u0061" + " " + "\u0061".getBytes().length);
System.out.println("\u024E" + " " + "\u024E".getBytes().length);
System.out.println("\u2013" + " " + "\u2013".getBytes().length);
System.out.println("\u65E5" + " " + "\u65E5".getBytes().length);
}
}
这种行为的解释是什么?
我必须将可能包含非罗马字符的文本存储到数据库中的固定字节长度字段中。我是否应该假设我应该将文本长度的四倍分配到安全的一边?
答案 0 :(得分:1)
方法getBytes()
没有给出字符串中存储的字节数。相反,它为您提供了在特定编码中表示此字符串的字节,在本例中为默认编码,可能是UTF-8。
在内部,字符串包含char
类型的数组,该类型每个项目只包含两个字节。但是,一些补充字符可能由两个数组条目表示,因此它们实际上可能在字符串中占用4个字节。
答案 1 :(得分:0)
UTF-16并不意味着每个字符都在2个字节上编码。
https://en.wikipedia.org/wiki/UTF-16
UTF-16(16位Unicode转换格式)是一种字符编码 能够编码Unicode中所有1,112,064个可能的字符。该 编码是可变长度的,因为代码点用一个或多个编码 两个16位代码单元。 (另请参阅Unicode编码的比较 比较UTF-8,-16& -32)
UTF-16是从早期的固定宽度16位编码开发的,称为 UCS-2(用于2字节通用字符集)一旦变得明确了a 固定宽度的2字节编码无法编码足够的字符 真正普及。