字符和字节详解、Java中字节串和字符串相互转换

字符、字节和编码

1. 程序中的字符与字节

字节是规定存储大小的存储单位,规定为8位一字节(8bit = 1 byte)。

字符是人类的描述符号。存储在计算机时,不同的编码格式会有不同的字节组合,一般由一个或多个字节表示。
字符和字节详解、Java中字节串和字符串相互转换_第1张图片
常用编码如下:
字符和字节详解、Java中字节串和字符串相互转换_第2张图片
重点是ANSI与UNICODE:

ANSI:在使用 ANSI 编码支持多种语言阶段,每个字符使用一个字节(8位)或多个字节来表示(MBCS),与英文字符的映射关系做了规定。因此,这种方式存放的字符也被称作多字节字符

UNICODE:用数字0-0x10FFFF与全部语言字符的映射关系做了规定。在 UNICODE 被采用之后,计算机存放字符串时,改为存放每个字符在 UNICODE 字符集中的序号。目前计算机一般使用 2 个字节(16 位)来存放一个序号(DBCS),因此,这种方式存放的字符也被称作宽字节字符。UTF-8是Unicode的实现方式之一。

2. Java 中相关实现方法

字符串类 String 中的内容是 UNICODE 字符串:

// Java 代码,直接写中文
String string = "中文123";

// 得到长度为 5,因为是 5 个字符
System.out.println(string.length())

字符串 I/O 操作,字符与字节转换操作。在 Java 包 java.io.* 中,以“Stream”结尾的类一般是用来操作 “字节串” 的类,以“Reader”,“Writer”结尾的类一般是用来操作“字符串”的类。

8位1字节,字节串为一个字节数组byte[],编码格式为ANSI。Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成byte数组型)。

通常在读取非文本文件时(如图片,声音,可执行文件)需要用字节数组(byte[])来保存文件的内容。在下载文件时,也是用byte数组作临时的缓冲器接收文件内容。所以说byte在文件操作时是必不可少的。不管是对文件写入还是读取都要用到。

字符串与字节串间相互转化
(1)字节串 =》字符串

// 按照 GB2312 格式得到字节(得到多字节字符串)
byte[] bytes = string.getBytes("GB2312");

// 将 bytes 字节串以 GB2312 格式解码转换为 UNICODE 格式的字符串
string = new String(bytes, "GB2312");

要将 String 按照某种编码写入文本文件,有两种方法:

// 第一种办法:用 Stream 类写入已经按照指定编码转化好的字节串
OutputStream os = new FileOutputStream("1.txt");
os.write(bytes);
os.close();

// 第二种办法:构造指定编码的 Writer 来写入字符串
Writer ow = new OutputStreamWriter(new FileOutputStream("2.txt"), "GB2312");
ow.write(string);
ow.close();

/* 最后得到的 1.txt 和 2.txt 都是 7 个字节 */

如果 java 的源程序编码与当前默认 ANSI 编码不符,则在编译的时候,需要指明一下源程序的编码。比如:

E:\>javac -encoding BIG5 Hello.java

(2)字符串 =》 字节串

String  str = "罗长";
byte[] sb = str.getBytes();

参考资料:
字符,字节和编码

Java之字符、字节与字符串

Java String 类

你可能感兴趣的:(Java,java,开发语言,后端)