int size = 12;
String s = "阿斯蒂芬";
byte[] b = new byte[size];
for(int i =0;i<b.length;i++)
{
b[i] = s.getBytes()[i];
}
String s1 = new String(b);
System.out.println(s1);有以上程序,测试并打印正确。若size改成非3的倍数,则该程序打印乱码。java中字符为1字节,汉字为2字节。为什么我需要定义3个字节才能解析一个字符呢?求解。
系统 windows xp 2002 service pack 3
CPU:e6600
String s = "阿斯蒂芬";
byte[] b = new byte[size];
for(int i =0;i<b.length;i++)
{
b[i] = s.getBytes()[i];
}
String s1 = new String(b);
System.out.println(s1);有以上程序,测试并打印正确。若size改成非3的倍数,则该程序打印乱码。java中字符为1字节,汉字为2字节。为什么我需要定义3个字节才能解析一个字符呢?求解。
系统 windows xp 2002 service pack 3
CPU:e6600
s.getBytes() 这个函数,他在生成字节数组的时候,是按照本地默认编码来生成的,我的电脑默认编码是GBK,一个汉字占2个字节,因此s.getBytes() 返回的数组长度为8,你做循环到11,显然超出数组范围了。在楼主的电脑上,我估计默认编码为UTF-8,所以是3个字节一个汉字,如果楼主想让汉字变为2字节,很简单,指定GBK编码就行了,代码如下
String s = "阿斯蒂芬";
int size = 8;
byte[] b = new byte[size];
for (int i = 0; i < size; i++) {
b[i] = s.getBytes(Charset.forName("GBK"))[i];
}
String s1 = new String(b, Charset.forName("GBK"));
System.out.println(s1);
80%是LZ的系统编码默认是UTF8,UTF8是用3个字节来表示汉字
会直接出现 null值。第二,改进版的 UTF-8只使用标准版 UTF-8中的单字节、双字节和三字节格式。Java虚拟机不能识别标准版 UTF-8格式定义 4字节格式,而是使用自定义的二次三字节(Two-Times-Three-Byte)格式来代替。
至于一楼所说的\0在java中不存在