Java中char类型**固定占用2个字节(16位)**UTF-16编码方案可以表示基本的多文平面BMP所有Unicode字符内部U0000 到 UFFFF。为什么是两个字节而不是一个字节Java设计之初决定全面支持国际化放弃C//C中char仅表示ASCII的局限性。Unicode标准在1996年定义了6536个码位但早期JavaJDK 1.01996年)采用Unicode。 1.1.1其BMP范围仅为0x万–0xfff共65536字符-2字节能完全覆盖。1字节最多表示256个字符远远不够中文、日文、阿拉伯文等常用文字2字节可以表示65536种组合以满足当时绝大多数语言的需求保持内存布局规则有利于JVM优化(如数组连续存储偏移计算简单)遇到超过BMP的字符怎么办Unicode后续扩展辅助平面Supplementary Planes例如emojiU1F600 ?、古汉字、数学符号等码点范围为U1000到U10FFF。这种字符不能单独使用char说Java用**代理对surrogate pair**处理两个char(共4字节)联合表示字符。高代理high surrogate0xD800–0xDBFF低代理low surrogate0xDC00–0xDFFF例如?U1F60A在字符串中占2个char?.length()返回2正确获取字符数应使用String.codePointCount(0, str.length())和byte、String字节长度的关系char它是Java的内存单元“字节”在不同的上下文中有不同的含义内存:每一个char变量或char[]元素恒占2字节(JVM规范强制)文件/网络传输String转换为字节数组时取决于编码方法 • UTF-其次ASCII字符占1字节中文通常为3字节emoji可能为4字节。• UTF-BMP字符占2字节辅助字符占4字节(即两个char)• ISO-8859-1只保留低8位中文会乱码不要混淆char大小和String.getBytes().length——后者是编码字节数而不是编码字节数char数量基本上就是这些。记住核心:Javachar是UTF-16代码单元固定2字节真正表达“字符”Unicode code point可能需要一两个char特别是在处理现代文本时必须使用与codePoint相关的API。