java和python的字符字节数问题

Java

  • Java中的基本类型char的字节数是固定的,2个字节,默认编码是UTF-16
  • Java中的字符串的字节数则是不固定的,对于英文字符,占1个字节,而对于中文字符的话,就会因为编码方式而改变:
    • 如GBK编码,中文字符2个字节
    • 如UTF-8编码,中文字符3个字节
  • 查看方式:str1.getBytes(“utf-8”).length

Python

  • Python没有基本类型,就是指字符串,原理和java类型,对于英文字符,占1个字节,而对于中文字符的话,就会因为编码方式而改变。
  • 查看方式:len(str1.encode(‘gbk’))

编码转化

java中char的默认编码是UTF-16,2个字节,但实际操作系统中的默认编码一般都是UTF-8,所以在程序中如果没有指定操作系统的编码,一般都会进行UTF-16到UTF-8的编译码转换。当char的字节范围超过2个字节时,java会通过utf-16 pair的形式来解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
       String s = "ョA";
try {
byte[] utf8 = s.getBytes("utf-8");//不指定的话就默认是OS的编码,一般UTF-8
System.out.println(utf8.length);
// System.out.println(s.getBytes("utf-16")[0]);
// System.out.println(s.getBytes("utf-16")[1]);
// System.out.println(s.getBytes("utf-16")[2]);
// System.out.println(s.getBytes("utf-16")[3]);
for (int i = 0; i < utf8.length; i++) {
System.out.println(byteToBit(utf8[i]));
}


byte[] utf16 = s.getBytes("utf-16");
System.out.println(utf16.length);
// System.out.println(s.getBytes("utf-16")[0]);
// System.out.println(s.getBytes("utf-16")[1]);
// System.out.println(s.getBytes("utf-16")[2]);
// System.out.println(s.getBytes("utf-16")[3]);
for (int i = 0; i < utf16.length; i++) {
System.out.println(byteToBit(utf16[i]));
}

}catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

结果:

1
2
3
4
5
6
7
8
9
10
11
12
4 //UTF-8的话,第一个字符3个字节,第二个字符1个字节(ACSII码)
11101111
10111101
10101110
01000001
6 //UTF-16的话,第一个字符4个字节,FEFF,FF6E pair,第二个字符2个字节(空字节+ASCII码)
11111110
11111111
11111111
01101110
00000000
01000001

对于byte和char:

byte就是1个字节,8位,int表示-128~127

char的话就是对应byte的编码表示,指定编码集后就对应char,一般不指定进行转换的话就是OS默认utf-8,char直接赋值的话存储的就是java默认utf-16


java和python的字符字节数问题
http://yoursite.com/2019/06/11/编程开发/Java/java和python的字符字节数问题/
作者
Wei Lyu
发布于
2019年6月11日
许可协议