字符编码相关报告
编码
- 编码,包括字符转为字符集id的过程,以及id如何用二进制存储的过程。前者涉及了字符集例如ascii、unicode,后者则涉及了ascii、utf-8、gbk。主要用于计算、数据存储、传输文字数据。
- 编码的原因:1.兼容:扩展字符集的时候还能兼容ASCII。2.高效:每个字符不固定长度,一般都小于32位,不用每个字符都是32位。
- String a=“abc”:在系统内是以unicode表示,使用char表示,对于英文只需要8位ASCII码。不编码的原因是:无法便利字符串,由于UTF-8是变长,无法知道第几个byte对应哪个字符,需要根据byte数组重新解码,会消耗CPU导致遍历变慢。
编码实践
写一个文件 file.txt
,写入英文字母“abc”,以及中文”你好”,合计五个字符,并用UTF-8存储。
如下:
file.txt
abc你好
任务:
- 首先自行写出该文件的二进制表示,写成 “01011001” 这样的01串形式。该步骤需要利用 https://unicode-table.com 该工具网站,可以查询每个字符在各类编码下譬如UTF-8 下的二进制表示。
- 其次,编写代码输出
file.txt
的二进制表示。 - 对比1和2中的二进制表示,他们应该一致。
代码
public static void main(String[] args)throws Exception
{
//按行读取文件
File file = new File("C:\Users\lxh\Desktop\test.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String s;
while ((s = br.readLine()) != null)
{
System.out.println(s);
//分解每一个字符
String[] split = s.split("");
//对每一个字符进行UTF-8的编码
for (String st:
split) {
byte[] bytes = st.getBytes(StandardCharsets.UTF_8);
//byte to binary array
for (byte b :
bytes) {
String replace = String.format("%8s",
Integer.toBinaryString(b & 0xFF)).replace(' ', '0');
System.out.print(replace+" ");
}
System.out.println();
}
}
}
结果
abc
01100001
01100010
01100011
你好
11100100 10111101 10100000
11100101 10100101 10111101