java中如果涉及到单字节操作,如果直接转换为String等,会有信息丢失或异常字符,
简单整理如下,这里可以再回顾下字符知识(ISO8859-1是单字节存储,GBK是双字节),
别名是Latin1,Iso-8859-1编码是属于单字节的编码,即编码的范围是0到255.总共能表示256个字符,向下兼容了ACSII,也就是在ASCII编码的基础上扩展了127-255之间位置。编码范围是0x00-0xFF,涵盖了部分西欧的语言字符.由于和计算机的存储单元一样,应用比较广泛,例如在网络传输协议中和Mysql数据库默认的编码。
参考https://blog.csdn.net/lili13897741554/article/details/82053351
代码示例:
// 返回客户端信息
InputStream input = socket.getInputStream();
byte[] bte = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = input.read(bte)) != -1) {
//发现转换后,字节被变更
sb.append(new String(bte, 0, len, "iso8859-1"));
}
//获取系统默认编码
System.out.println(System.getProperty("file.encoding"));
//获取系统默认的字符编码
System.out.println(Charset.defaultCharset());
//获取系统默认语言
System.out.println(System.getProperty("user.language"));
//Java中byte[]转String问题 丢失字节;ISO-8859-1 仍然是单字节编码,它总共能表示 256 个字符。
//new String使用其他编码如GBK,GB2312的话一样也会导致字节数组发生变化,因此要想获取String里单字节数组,就应该使用iso8859-1编码
System.out.println("Start.info from client :" + sb.toString());
String resp = sb.toString();
byte[] srcBuf = resp.getBytes("iso8859-1");