首先常用的byte[]直接转String很简单:
- public static void main(String[] args) {
- String str="我是中国人";
- byte[] arr=str.getBytes();
- System.out.println("打印:"+arr);
- for(byte e : arr) {
- System.out.print(e + " ");
- }
- String str2=new String(arr);
- System.out.println("\n打印2:"+str2);
- }
比如上面这个,输出的结果是:
- 打印:[B@15db9742
- -50 -46 -54 -57 -42 -48 -71 -6 -56 -53
- 打印2:我是中国人
那么java中是如何处理字符编码的?这就需要规范了,
JAVA使用自己的String类,并且String类对象是不需要指定编码表的!为什么它会自己知道一堆数字各代表什么字符呢?就是因为String里的字符信息是用UNICODE编码存放的。而JAVA为了表示字符(注意是单个字符),也有char这个数据类型,而且他的大小是固定2个8位16进制数字长度,也就是0~65535。为的就是对应UNICODE里面的一个字符。大家如果想取一个String里的按UNICODE数字,可以用getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 方法取得一个char[],这个char[]里就是表示String字符的,按UNICODE编码表编码的数字。
为什么会出现byte[ ]转String又会出现乱码现象?
很显然,就是上面提到的,编码规范不一样。举个栗子,比如GB2312规范的中文“当”字,就是用0xB5,0xB1这两个八位的数字来表示的。在英文系统上,没有GB2312编码表,给他一个0xB5,0xB1,他就傻傻的当作ASCII来处理。放到Java里,他又会按照自己的UNICODE规范来处理,所以规范不一样,就会出现奇怪的结果,也就是乱码。
那么我们怎么解决byte[ ]转String的乱码问题呢?
得看byte[]来自哪里了。时常会遇到,要把一张图片转为byte[]然后在转为String流对象传输到别的地方,接收者再转为byte[]再变成图片。
①有人推荐使用序列化,这也是一个方案,但是具体实施还没有研究过。
②直接传输byte[]的话,会出现byte[]过长数据丢失。因为不是所有的byte组合都可以映射成char
③那么就是用常见的Base64编码规范吧。base64的编码规范就是将常见的字符转换成6位二进制表示(常用64个所以叫base64吧)。怎么写,有现成的工具类哦如下:
- import org.apache.commons.codec.binary.Base64;
- public class UtilHelper {
- //base64字符串转byte[]
- public static byte[] base64String2ByteFun(String base64Str){
- return Base64.decodeBase64(base64Str);
- }
- //byte[]转base64
- public static String byte2Base64StringFun(byte[] b){
- return Base64.encodeBase64String(b);
- }
- }
知识贵在积累。
补充base64编码说明:
Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。
为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为2^6=64,这也是Base64名称的由来。
Base64编码表
码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w | |||
1 | B | 17 | R | 33 | h | 49 | x | |||
2 | C | 18 | S | 34 | i | 50 | y | |||
3 | D | 19 | T | 35 | j | 51 | z | |||
4 | E | 20 | U | 36 | k | 52 | 0 | |||
5 | F | 21 | V | 37 | l | 53 | 1 | |||
6 | G | 22 | W | 38 | m | 54 | 2 | |||
7 | H | 23 | X | 39 | n | 55 | 3 | |||
8 | I | 24 | Y | 40 | o | 56 | 4 | |||
9 | J | 25 | Z | 41 | p | 57 | 5 | |||
10 | K | 26 | a | 42 | q | 58 | 6 | |||
11 | L | 27 | b | 43 | r | 59 | 7 | |||
12 | M | 28 | c | 44 | s | 60 | 8 | |||
13 | N | 29 | d | 45 | t | 61 | 9 | |||
14 | O | 30 | e | 46 | u | 62 | + | |||
15 | P | 31 | f | 47 | v | 63 | / |